Ruby Ruby 1.8 有个这么大的坑呀

ibachue · 2013年12月19日 · 最后由 sevk 回复于 2013年12月19日 · 2207 次阅读

在 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 导致结果可能和预期完全不同。

乖乖的加层括号吧

尽快升级到 Ruby 2.0.0 吧。

ruby 1.9 里面呢?

乖乖加括号,我只敢在简单的一行语句里面省略括号。 程序写严谨点可以少跳很多坑。

#4 楼 @linjunhalida #1 楼 @camel 还是尽量早点逃离 1.8 比较好

学习了,多谢

需要 登录 后方可回复, 如果你还没有账号请 注册新账号