Ruby 2.1中的数组#to_s打破了我的代码

时间:2014-12-17 19:06:42

标签: ruby ruby-2.1.4

这段代码在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>]

这是在某处记录的吗?如何保留旧的行为?

3 个答案:

答案 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_sputs为您完成工作

puts [Test.new(), Test.new()]
# hi
# hi

如果你想要括号,那就是inspect的含义(在这种情况下你需要定义Test#inspect)。