【问题标题】:Why does Ruby evaluate these two expressions differently? The only difference is {...} and do...end [duplicate]为什么 Ruby 以不同的方式评估这两个表达式?唯一的区别是 {...} 和 do...end [重复]
【发布时间】:2018-09-07 15:10:30
【问题描述】:

这个表达式:

pp [1, 2, 3].map { |r| r+1 }

评估为:

[2, 3, 4]
=> [2, 3, 4]

正如预期的那样。但是,这个表达式:

pp [1, 2, 3].map do |r|
  r+1
end

评估为:

#<Enumerator: ...>
=> #<Enumerator: [1, 2, 3]:map>

为什么 pp 在第二种情况下看到的是枚举数,而不是映射的数组?

【问题讨论】:

标签: arrays ruby enumerator


【解决方案1】:

优先级很重要。 {} 的优先级高于方法调用。 do-end 的优先级较低。

pp [1, 2, 3].map { |r| r + 1 }

被解析为pp ([1, 2, 3].map { |r| r + 1 }),即:

pp([1, 2, 3].map { |r| r + 1 })

pp [1, 2, 3].map do |r| r + 1 end

被解析为(pp [1, 2, 3].map) do |r| r + 1 end,即:

pp([1, 2, 3].map, &->(r){ r + 1 })

在后一种情况下,将块传递给ppNOOP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    相关资源
    最近更新 更多