新手问题 {} 与 do end 的区别?

wwwicbd · 2017年09月29日 · 最后由 mizuhashi 回复于 2017年09月29日 · 1694 次阅读
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 属于最左的调用

需要 登录 后方可回复, 如果你还没有账号请 注册新账号