Почему `[].to_s.empty?` ведет себя по-разному между ruby ​​1.9 и 2.0?

Это было поведение в 1.9 ruby:

[].to_s.empty? #=> false
{}.to_s.empty? #=> false
[].to_s #=> "[]"
{}.to_s #=> "{}"
[43,43].to_s #=> "[43, 43]"
{"fire"=>"water"}.to_s #=> "{\"fire\"=>\"water\"}"

Это поведение в 2.0 ruby:

[].to_s.empty? #=> true
{}.to_s.empty? #=> true
[].to_s #=> ""
{}.to_s #=> ""
[43,43].to_s #=> "4343"
{"fire"=>"water"}.to_s #=> "firewater"

Меня интересует это изменение поведения для метода to_s в версии 2.0.

Редактировать: Мои извинения. Я закрываю этот вопрос. По какой-то причине я думал, что использую 2.x.x ruby, но путь был перепутан. Он указывал на версию ruby ​​1.8.7, которая была на изображении. Когда я исправил путь, указывающий на правильный рубин (2.1.4), я вижу правильное поведение.


person poliva83    schedule 19.01.2015    source источник
comment
Это не правильное поведение. 2.0 должен вести себя точно так же, как 1.9.3. Проверьте, не загружены ли у вас расширения в ruby ​​или irb.   -  person Grych    schedule 19.01.2015
comment
в частности, какую сборку 1.9 вы тестируете?   -  person Xavier Shay    schedule 19.01.2015
comment
[].to_s является '[]' в 2.2, 2.1, 2.0 и 1.9.3, поэтому ни один из них не должен говорить, что [].to_s пусто. Ваши [43,43].to_s и {"fire"=>"water"}.to_s тоже странные в 2.0.x, так что же не так с вашими методами to_s?   -  person mu is too short    schedule 19.01.2015
comment
А что такое x в 2.0.x? Был ли где-нибудь регресс to_s к поведению 1.8.7? Вы уверены, что используете 2.0.x, а не 1.8.7? 1.8.7 дает именно те результаты, которые вы заявляете для 2.0.x.   -  person mu is too short    schedule 19.01.2015
comment
Это выглядит совсем не так. Что дает RUBY_VERSION для теста 2.0.x?   -  person tadman    schedule 19.01.2015
comment
В Ruby 2.0 to_s был изменен на псевдоним inspect. Единственное изменение, о котором я знаю, это то, что при вызове to_s для Array в 1.9.3 он вернет to_s метод(ы) объектов, содержащихся внутри, но в 2.0 он вернет inspect этих объектов. например class Frog; def to_s "monkey" end; end. В 1.9.3. [Frog.new].to_s #=> "[monkey]" и в 2.0 [Frog.new].to_s #=> "[#<Frog:0x00000002f28828>]", но я не могу воспроизвести то, что вы показываете, как утверждали другие. Поэтому, если Array#to_s и Hash#to_s не были переопределены в пустые строки, ваши выводы неверны.   -  person engineersmnky    schedule 20.01.2015
comment
Это усложняет использование вашего вопроса empty?. Вы должны сравнить результаты, такие как [].to_s, {}.to_s без empty?. Это сделало бы вопрос более ясным.   -  person sawa    schedule 20.01.2015


Ответы (1)


В 2.x это вывод [].to_s

2.1.5 :001 > [].to_s
 => "[]"
2.1.5 :002 > [43,43].to_s
 => "[43, 43]"

Учитывая, что он не соответствует вашей настройке Ruby, определенно есть что-то, что меняет его в вашей системе.

Попробуйте начать простую, ясную irb сессию. Если это работает так, как я показал выше, это означает, что в вашем приложении Ruby что-то не так.

Если это не работает, это означает, что в вашей настройке Ruby что-то не так.

Независимо от того, где проблема, мне интересно, почему вы полагаетесь на такой код, как

[].to_s.empty?

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

[].empty?

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

[].join("").empty?
person Simone Carletti    schedule 19.01.2015
comment
Спасибо за Ваш ответ. Машина, над которой я работал, имела неверный путь к окружению и на самом деле указывала на очень старую версию ruby ​​(1.8.7). - person poliva83; 20.01.2015