塊和過程和 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 呼叫括在括號中或使用 { ... } 代替。