我正在通过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"]
。是什么给了什么?
答案 0 :(得分:0)
Hash
构造函数使用对同一数组的引用作为默认值,因此默认情况下所有哈希值都将实际初始化为同一个数组,直到您在哈希上使用[]=
运算符为止密钥(例如,hash[:one] = some_new_object
)。这就是你在数组中看到两个字符串的原因。
根据this answer to another question,您需要为Hash构造函数使用块形式。将为每个新的哈希键执行该块:
hash = Hash.new { |h,k| h[k] = [] }
对于以冒号为前缀的标记,这些是所谓的符号的文字。符号很像字符串,但有一些重要的区别。一个是相同的符号值将始终引用内存中的同一个对象(对于字符串不一定是这样)。符号具有其他特性,使它们的性能略优于常量字符串。其他符号非常像字符串文字。