为什么在分配变量时,do/end块的行为/返回方式不同?

sun*_*ity 3 ruby

puts [1,2,3].map do |x| 
  x + 1 
end.inspect
Run Code Online (Sandbox Code Playgroud)

随着ruby 1.9.2的回归

<Enumerator:0x0000010086be50>
Run Code Online (Sandbox Code Playgroud)

红宝石1.8.7:

# 1
# 2
# 3
Run Code Online (Sandbox Code Playgroud)

分配变量......

x = [1,2,3].map do |x| 
  x + 1 
end.inspect

puts x
Run Code Online (Sandbox Code Playgroud)

[2,3,4]

小胡子块按预期工作:

puts [1,2,3].map { |x| x + 1 }.inspect
Run Code Online (Sandbox Code Playgroud)

[2,3,4]

sep*_*p2k 9

puts [1,2,3].map do |x| 
  x + 1 
end.inspect
Run Code Online (Sandbox Code Playgroud)

被解析为:

puts([1,2,3].map) do |x| 
  x + 1 
end.inspect
Run Code Online (Sandbox Code Playgroud)

map,没有块(这将使它返回1.8中的未更改数组和1.9中的枚举器)被调用,并且块被传递给puts(它将忽略它).

它的工作原理与原因{},而不是do end在于{}具有不同的优先级,所以它解析为:

puts([1,2,3].map { |x| x + 1 }.inspect)
Run Code Online (Sandbox Code Playgroud)

类似地,使用变量的版本也起作用,因为在这种情况下根本没有歧义.


归档时间:

查看次数:

297 次

最近记录:

14 年,5 月 前