块和过程和 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
调用括在括号中或使用 { ... }
代替。