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

wwwicbd · September 29, 2017 · Last by mizuhashi replied at September 29, 2017 · 1693 hits
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 属于最左的调用

You need to Sign in before reply, if you don't have an account, please Sign up first.