RubyKoans - 令人困惑的哈希示例

时间:2012-03-02 17:29:49

标签: ruby hash

  

可能重复:
  How does shovel (<<) operator work in Ruby Hashes?

我正在通过RubyKoans,而关于哈希的一个例子让我很困惑。该示例位于about_hashes.rb文件中。这是令我困惑的代码:

hash = Hash.new([])

hash[:one] << "uno"
hash[:two] << "dos"

assert_equal __, hash[:one]

对于那些不熟悉RubyKoans的人,你应该为双下划线填写正确的值。

在此示例中,我看到名为hash的变量正在使用Hash对象构造函数,该构造函数将nil的默认值替换为空Array。然后,使用hash Ruby运算符将两个项添加到<<,每个项都有一个数组元素。我希望hash[:one]会返回一个值["uno"]的数组,但Ruby告诉我它实际上是["uno", "dos"]。是什么给了什么?

1 个答案:

答案 0 :(得分:0)

Hash构造函数使用对同一数组的引用作为默认值,因此默认情况下所有哈希值都将实际初始化为同一个数组,直到您在哈希上使用[]=运算符为止密钥(例如,hash[:one] = some_new_object)。这就是你在数组中看到两个字符串的原因。

根据this answer to another question,您需要为Hash构造函数使用块形式。将为每个新的哈希键执行该块:

hash = Hash.new { |h,k| h[k] = [] }

对于以冒号为前缀的标记,这些是所谓的符号的文字。符号很像字符串,但有一些重要的区别。一个是相同的符号值将始终引用内存中的同一个对象(对于字符串不一定是这样)。符号具有其他特性,使它们的性能略优于常量字符串。其他符号非常像字符串文字。