小编Joe*_*oep的帖子

为什么`.each`在`.select`之后调用惰性枚举时返回nil?

我有一段代码如下:

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条消息,则该操作不再需要延迟.尽管如此,这仍然让我感到惊讶.

ruby enums

16
推荐指数
1
解决办法
315
查看次数

标签 统计

enums ×1

ruby ×1