我有一段代码如下:
sent_messages = messages.lazy.reject { |m| message_is_spam?(m) }
.each { |m| send_message(m) }
# Do something with sent_messages...
Run Code Online (Sandbox Code Playgroud)
某些上下文:message_is_spam?如果邮件的收件人在最近5分钟内收到消息,则该方法返回true.当messages包含同一收件人的多条消息时,后一条消息将仅在发送第一条消息后被视为垃圾邮件.为了确保后一条消息被视为垃圾邮件,我懒惰地拒绝垃圾邮件并发送它们.
我希望.each返回一个包含所有项目的数组,但我得到了nil..each总是返回一个数组,除了在这一个场景中:
[].each {} # => []
[].lazy.each {} # => []
[].select {}.each {} # => []
[].lazy.select {}.each {} # => nil
Run Code Online (Sandbox Code Playgroud)
为了增加混淆,JRuby返回[]上面的所有示例.
为什么这样.each调用时返回nil?我在文档中找不到任何关于它的内容,很难弄清楚C代码中发生了什么.
我已经找到了彻底绕过这个问题的方法; 如果我为每个收件人(messages.uniq_by(&:recipient))选择最多1条消息,则该操作不再需要延迟.尽管如此,这仍然让我感到惊讶.