n = 0 p Array.new(3) { n += 1 } p Array.new(3) do n += 1 end __END__ [1, 2, 3] [nil, nil, nil]
{} 和 do end 的结果不同,该如何解释呢?
用{}的时候
Array.new(3){ n += 1 }
这是一个整体,所以输出的是执行完这条语句的结果(也就是一个新的数组) 而用 do end 的时候,输出的是
Array.new(3)
的值,do end 代码块里的语句还没执行,所以是 [nil,nil,nil]
是那个 p 造成的。
n = 0 p (Array.new(3) do n += 1 end)
没有括号会有歧义,do 被忽略了。
优先级的问题
p( Array.new(3) do |i| i+=1 end )
{}属于最右的调用,do end 属于最左的调用