У меня есть фрагмент кода, который выглядит следующим образом:
sent_messages = messages.lazy.reject { |m| message_is_spam?(m) }
.each { |m| send_message(m) }
# Do something with sent_messages...
В некотором контексте: метод message_is_spam?
возвращает значение true, если получатель сообщения был отправлен в течение последних 5 минут. Когда messages
содержит несколько сообщений для одного и того же получателя, последнее сообщение считается спамом только после отправки первого сообщения. Чтобы последнее сообщение считалось спамом, я лениво отклоняю спам-сообщения и отправляю их.
Я ожидаю, что .each
вернет массив, содержащий все элементы, но вместо этого получаю nil
. .each
всегда возвращает массив, кроме этого сценария:
[].each {} # => []
[].lazy.each {} # => []
[].select {}.each {} # => []
[].lazy.select {}.each {} # => nil
Чтобы добавить к путанице, JRuby возвращает []
во всех примерах выше.
Почему .each
возвращает nil при вызове так называемый? Я не могу найти что-либо в документах об этом, и трудно понять, что происходит в C-коде.
Я уже понял способ полностью обойти эту проблему; если я выбираю до 1 сообщения на каждого получателя (messages.uniq_by(&:recipient)
), операция больше не должна быть ленивой. Тем не менее, это все еще меня удивляет.