Массив #to_s в Ruby 2.1 сломал мой код

Этот код сломался на 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 ответа

Решение

Ваш код:

puts [Test.new(), Test.new()].to_s

сомнительное использование Array.to_s, Вместо этого я бы использовал:

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

Хотя я вижу, что первое использование имеет смысл, второе использование имеет больше смысла и должно работать в любой версии Ruby.

На 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]

Это похоже на ошибку для меня. Если это предполагаемое поведение, это действительно раздражает.

Вам не нужно to_s, puts делает работу за вас

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

Если вы хотите скобки, вот что inspect для (в этом случае имеет смысл, что вам нужно будет определить Test#inspect).

Другие вопросы по тегам