Ruby 2.1中的数组to破坏了我的代码

Ruby 2.1中的数组to破坏了我的代码,ruby,ruby-2.1.4,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 -

这段代码在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>]
$ruby--version
ruby 2.1.4p265(2014-10-27修订版48166)[x86_64-linux]
$ruby test.rb
[#, #]
这有文件记录吗?如何保留旧的行为?

在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]
这对我来说似乎是一个错误。如果这是故意的行为,那真的很烦人。

您的代码:

puts [Test.new(), Test.new()].to_s
使用
Array.to\s
有问题。相反,我会使用:

puts [Test.new(), Test.new()].map(&:to_s)

虽然我可以看出第一次使用是有意义的,但第二次使用更有意义,应该适用于任何版本的Ruby。

您不需要
来使用
<代码>放置
为您工作

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

如果您需要括号,这就是
inspect
的用途(在这种情况下,您需要定义
Test\inspect
)。

根据文档,它声明将返回对象的类编码对象的Id。与此处相同:@user944938,但OP提供了他自己的to#s()实现“Ruby 2.0使用#to#s作为#inspect的别名”(直接来自松本幸弘)我不想覆盖inspect。我使用它的目的不同。我想有一种方法可以解决这个问题,我想没有。谢谢。我同意这一点。当你想在枚举表中的对象上调用方法时,我认为你应该进入该对象,并在内部使用类似于
map
的东西来调用该方法。我与2.0版本相比,您认为最初的实现与OO设计的一致性稍差一些
实际上比
数组#to _s
的速度要快很多。虽然这个简单的实现是无关紧要的,但是大规模实现可以显示高达60%的性能差异。尽管请注意,在这种情况下,输出
数组#to _s
的差异将是
“[hi,hi]”
,其中为
映射(&:to_)
将是
[“嗨”,“嗨”]