在 Ruby 1.8 中,这段代码的执行结果是这样的:
def f a
a.class
end
f (1 + 2).to_s # => String
"#{f (1 + 2).to_s}" # => "Fixnum"
注意最后一行,完全相同的代码,写进内联字符串结果都完全变了,是因为结合的优先级发生了改变。写在外面的时候,(1 + 2)
与to_s
率先结合得到"3"
,然后再和f
结合得到String
,是因为f
和后面的部分有个空格所致。
而写在内联字符串中的时候,f (1 + 2)
竟然率先结合了,返回结果Fixnum
再和to_s
结合变成了"Fixnum"
。
这个坑直接导致绝不能在 Ruby 1.8 上使用 FastEruby,因为 FastEruby 就是利用了内联字符串的特性来执行模版代码的,但这个 Bug 导致结果可能和预期完全不同。