块和过程和 Lambdas

如果有一个链接多个方法的行,请注意运算符优先级,例如:

str = "abcdefg"
puts str.gsub(/./) do |match|
  rand(2).zero? ? match.upcase : match.downcase
end

不像你期望的那样打印像 abCDeFg 这样的东西,而是打印像 #<Enumerator:0x00000000af42b28> 这样的东西 - 这是因为 do ... end 的优先级低于方法,这意味着 gsub 只能看到/./参数,而不是块参数。它返回一个枚举器。该块最终传递给 puts,忽略它并只显示 gsub(/./) 的结果。

要解决此问题,请将 gsub 调用括在括号中或使用 { ... } 代替。