今天我开始测试JRuby。我是一个Java Ruby开发者,所以我一眼就喜欢这种混合。然后编码一点,我发现了一个差异,我想知道这是不是正确的。
我使用JRuby1.7.2和Ruby1.8.7进行测试。
在jruby控制台中,我键入:

c = []
c.class #=> Array
c << 9 << 8 << 0 << 2
c.to_s #=> "[9, 8, 0, 2]"

现在在ruby控制台中,我输入了:
c = []
c.class #Array
c << 9 << 8 << 0 << 2
c.to_s #=> "9802"

这里会发生什么,为什么两种情况的结果不一样?

最佳答案

您看到的区别并不是ruby和jruby本身的不兼容。JRuby1.7.x默认与Ruby1.9.3兼容,因此您实际上看到的是Ruby1.8.7和Ruby1.9.3之间的array-to-u方法的行为差异。
通过将开关“--1.8”传递给jruby命令或设置环境变量jruby-opts,可以打开jruby的1.8兼容模式,如下所示:

export JRUBY_OPTS='--1.8'.

例如,这是JRuby 1.7.2的默认1.9兼容模式:
$ JRUBY_OPTS='' irb
> ([] << 9 << 8 << 0 << 2).to_s
=> "[9, 8, 0, 2]"

下面是启用1.8兼容性的结果:
$ JRUBY_OPTS='--1.8' irb
> ([] << 9 << 8 << 0 << 2).to_s
=> "9802"

07-24 19:22