Ruby Hash解释

时间:2013-09-15 21:47:47

标签: ruby hash

我不理解CodeAcademy中的这一特定步骤。

text = puts "Hello text please"
text = gets.chomp

words = text.split(' ')
frequencies = Hash.new(0)
words.each { |x| frequencies[x] += 1 }

我们的想法是过滤输入以返回每个单词的散列以及单词出现的次数。无法理解为什么会这样。

words.each { |x| frequencies[x] += 1 }

不按{key, value}方法哈希工作吗?

2 个答案:

答案 0 :(得分:5)

设置哈希值的语法是:

hash_name[key] = value

该值引用为hash_name[key]。所以:

frequencies = Hash.new(0)

这会创建一个新的哈希,如果您读取未知密钥的哈希值,它将允许它并将密钥的值默认为0(返回0)。如果没有0参数,则没有默认键值,因此使用未知键读取哈希将产生nil。但是使用默认返回值0,以下内容:

words.each { |x| frequencies[x] += 1 }

通过遍历所有单词,将它们用作键,即使它们最初不存在,并为散列键frequency[x]递增x的散列值,也可以利用默认值。 (现在的话)。如果尚未设置,则从0开始,这是您想要计算的东西。这是因为+=确实意味着frequencies[x] = frequencies[x] + 1,并且当{尚未设置值'时,frequencies[x]返回的初始值将为0

答案 1 :(得分:1)

我不确定你的问题究竟在哪里,但希望这会有所帮助。

  

不通过{key,value}方法进行哈希处理吗?

是的。在行

words.each { |x| frequencies[x] += 1 }

哈希称为frequencies,密钥为x。该键的值由表达式frequencies[x]返回。

它就像一个数组,但使用字符串作为索引而不是整数。 data[2]是存储在由data标识的数组2的元素中的值,而frequencies[x]是存储在由{指示的散列frequencies的元素处的值{1}}。

x具有通常的含义作为Ruby缩写,因此+=var += 1相同。

因此var = var + 1frequencies[x] += 1:它会将frequencies[x] = frequencies[x] + 1标识的哈希元素的当前值加1。

拼图中的最后一部分是x的创建方式。通常,访问尚未分配的哈希元素会返回frequencies。使用nil通常会引发+=错误,因为没有方法undefined method '+' for nil:NilClass。但是使用NilClass#+会创建一个默认值为零的哈希值,因此此哈希值的不存在元素将计算为Hash.new(0)而不是0,现在当你第一次尝试增加一个元素时,一切正常。