2012-03-02 83 views
0

可能重复:
How does shovel (<<) operator work in Ruby Hashes?RubyKoans - 混淆哈希例如

我做我的方式通过RubyKoans,以及关于散列的例子之一是真的困惑了我。该示例位于about_hashes.rb文件中。这里是困惑我的代码:

hash = Hash.new([]) 

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

assert_equal __, hash[:one] 

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

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

+1

如果你有两个问题,你应该问两个问题。这样他们都可以被回答,他们都可以被Google搜索到,他们都可以被其他具有相同问题的人发现。目前,你关于':foobar'的问题被隐藏在一个带有'Hash'标题的问题中,用'hash'标记。 – 2012-03-02 17:38:34

回答

0

Hash构造使用相同的数组作为缺省值,所以直到使用[]=操作者上的散列键所有的散列值将实际被初始化为默认相同数组的引用(例如,hash[:one] = some_new_object)。这就是为什么你在数组中看到两个字符串的原因。

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

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

至于冒号为前缀的令牌,这些都是所谓的符号文字。符号很像字符串,但有一些重要的区别。一个是相同的符号值将始终引用内存中的同一个对象(这不一定是字符串)。符号具有其他特性,使其性能比常量字符串稍好。其他符号非常像字符串文字。

+0

有没有办法在不使用块语法的情况下实现相同的结果?这种Ruby行为真的很奇怪。 – 2012-03-02 17:44:37