Ruby 1.8和Ruby 1.9中`Array#to_s`的区别

mpo*_*map 3 ruby arrays ruby-1.9 ruby-1.8

可能重复:
Ruby 1.9 Array.to_s的行为有何不同?

我想知道是否有人能告诉我Ruby 1.8.7和Ruby 1.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"
Run Code Online (Sandbox Code Playgroud)

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\"]"
Run Code Online (Sandbox Code Playgroud)

并没有真正寻找一种不同的方式来做这件事只是好奇两个版本之间的变化.

man*_*oid 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);
}
Run Code Online (Sandbox Code Playgroud)

换句话说,在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);
}
Run Code Online (Sandbox Code Playgroud)

换句话说,在1.9.3中,to_s代表参加inspect.

注意:将来,如果您想知道两个版本之间存在差异,可以尝试查看源代码.很容易从这里下拉:https://github.com/ruby/ruby

当然不是一切都很容易找到,但如果你搜索一下,你可以经常找到好的线索.在这种情况下,array.c有你想要的.

然后你可以通过发出git checkout ruby_1_8_7和来回切换版本git checkout ruby_1_9_3.