这段代码在Ruby 2.1上打破了
class Test
def to_s()
"hi"
end
end
puts [Test.new(), Test.new()].to_s
Ruby 1.9.3:
$ ruby --version
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]
$ /opt/chef/embedded/bin/ruby test.rb
[hi, hi]
Ruby 2.1:
$ ruby --version
ruby 2.1.4p265 (2014-10-27 revision 48166) [x86_64-linux]
$ ruby test.rb
[#<Test:0x000000022ac400>, #<Test:0x000000022ac3d8>]
这是在某处记录的吗?如何保留旧的行为?
答案 0 :(得分:5)
您的代码:
puts [Test.new(), Test.new()].to_s
是对Array.to_s
的疑问。相反,我会使用:
puts [Test.new(), Test.new()].map(&:to_s)
虽然我可以看到第一次使用是有意义的,但第二次使用更有意义,并且应该适用于任何版本的Ruby。
答案 1 :(得分:1)
关于ruby 2.1.5:
class Test
def to_s
"hi"
end
alias inspect to_s # add this line
end
puts [Test.new, Test.new].to_s
#=> [hi, hi]
这对我来说似乎是个错误。如果它是预期的行为,那真的很烦人。
答案 2 :(得分:0)
您不需要to_s
。 puts
为您完成工作
puts [Test.new(), Test.new()]
# hi
# hi
如果你想要括号,那就是inspect
的含义(在这种情况下你需要定义Test#inspect
)。