3

重複の可能性:
Ruby 1.9 Array.to_sの動作が異なりますか?

Ruby1.8.7とRuby1.9.3の間で何が変わったのか誰か教えてもらえませんか。2つのバージョンでまったく異なる動作をする以下の例がありますが、Rubyのドキュメントによると、これらのバージョン間で何も変更されていないようです。

Ruby 1.8

number = '123-45-6789' 
# => "123-45-6789"
number.scan(/[0-9]/)
# => ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
number.scan(/[0-9]/).to_s
# => "123456789"

Ruby 1.9

number = '123-45-6789'
# => "123-45-6789" 
number.scan(/[0-9]/)
# => ["1", "2", "3", "4", "5", "6", "7", "8", "9"]    
number.scan(/[0-9]/).to_s
# => "[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"]"

これを行うための別の方法を実際に探しているわけではなく、2つのバージョン間で何が変わったかについて興味があります。

4

3 に答える 3

5

実際にRubyソースコードに含まれているものは次のとおりです。

1.8.7:

rb_ary_to_s(ary)
    VALUE ary;
{
    if (RARRAY(ary)->len == 0) return rb_str_new(0, 0);
    return rb_ary_join(ary, rb_output_fs);
}

つまり、1.8.7では、をto_s呼び出しますjoin

1.9.3:

rb_ary_inspect(VALUE ary)
{
    if (RARRAY_LEN(ary) == 0) return rb_usascii_str_new2("[]");
    return rb_exec_recursive(inspect_ary, ary, 0);
}

VALUE
rb_ary_to_s(VALUE ary)
{
    return rb_ary_inspect(ary);
}

つまり、1.9.3では、にto_s委任しinspectます。

注:将来、2つのバージョン間で観察されている違いについて疑問がある場合は、ソースコードを試してみることができます。ここから簡単にプルダウンできます:https ://github.com/ruby/ruby

もちろん、そこにすべてが簡単に見つかるわけではありませんが、少し検索すると、良いリードを見つけることができます。この場合、array.cあなたが探しているものを持っています。

git checkout ruby_1_8_7次に、とを発行してバージョンを切り替えることができますgit checkout ruby_1_9_3

于 2012-10-01T19:09:08.227 に答える
2

to_s、オブジェクトを文字列に変換する必要があることを実際に実行するように変更されました。

1.8の実装を検討してください...

  1. toメソッドを配列オブジェクトに送信するto_sと、文字通り実行されarray_object.join('').to_sます。この私見はやりすぎです。
  2. この実装はまた、配列オブジェクトを誤って表現します。このto_s方法は、主にこの方法とinspect密接に関連しています(ここで頭を悩ませているため、間違っている場合は訂正してください)。また、ここでメソッドの出力を確認する必要があるto_s場合、オブジェクトが、、またはクラスのものであるかどうかはわかりArrayませStringFixnum

1.9実装を入力してください...

  1. 出力の構造は、オブジェクトが配列であることを明確に示しています。

そうは言っても、これはRubyチームによるUXデザインの決定だったと思います... to_s1.8の方がかなり高速だからです!

このマイクロベンチマークを検討してください...

OS_X_Terminal $> time ruby -e "(1..1000000).to_a.map(&:to_s).to_s"

| Ruby Version | average runtime |
|    1.9.3     |      1.678      |
|    1.9.2     |      1.817      |
|    1.8.7     |      1.106      |

これが私がこれまでに持っているすべてです。コメントはいつでも大歓迎です(:

于 2012-10-01T18:49:33.233 に答える
0

ルビーは何をするかについて賢くなったよう.to_sです。以前は馬鹿げていて、何らかの理由で配列内のすべてのエントリを並べて一覧表示していました。ruby 1.9では、配列を受け取り、文字通り文字列に変換します。これは、よりスマートな処理方法です.to_s

于 2012-10-01T18:18:17.287 に答える