Массив #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
).