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

标签 ruby arrays ruby-1.9 ruby-1.8

<分区>

Possible Duplicate:
Ruby 1.9 Array.to_s behaves differently?

我想知道是否有人可以告诉我 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"

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\"]"

并不是真的在寻找一种不同的方法来做到这一点,只是想知道两个版本之间发生了什么变化。

最佳答案

这是 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 委托(delegate)给 inspect

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

当然,并不是所有的东西都可以在那里轻松找到,但如果你四处搜索一下,你通常可以找到好的线索。在这种情况下,array.c 有您要查找的内容。

然后您可以通过发出 git checkout ruby​​_1_8_7git checkout ruby​​_1_9_3 在版本之间来回切换。

关于ruby - Ruby 1.8 和 Ruby 1.9 中 `Array#to_s` 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12678218/

相关文章:

ruby - 如何在 debian lenny 上安装 ruby​​ 1.9.2?

ruby-on-rails - 如何修复 Ruby "no such file to load -- xsd/qname"错误?

ruby - 安装多个版本的 Ruby 的最佳实践,除了 rvm?

ruby-on-rails - 将 TrueClass/FalseClass 的值输出为整数或字符串/

ruby-on-rails - 制作一个 form_for 将数据添加到现有模型(rails)

ruby-on-rails - Ruby 使用正则表达式替换散列键

javascript - 在 Angular 中从数组的数组中获取元素

c++ - 似乎无法在 C++ 中正确调用函数

javascript - 我在 javascript 中更新一个数组(键,值)对象

ruby - 不转换成字符串,一个Fixnum有多少位数?