У меня есть фрагмент кода, который выглядит следующим образом:
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)), операция больше не должна быть ленивой. Тем не менее, это все еще меня удивляет.