我不理解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}
方法哈希工作吗?
答案 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 + 1
为frequencies[x] += 1
:它会将frequencies[x] = frequencies[x] + 1
标识的哈希元素的当前值加1。
拼图中的最后一部分是x
的创建方式。通常,访问尚未分配的哈希元素会返回frequencies
。使用nil
通常会引发+=
错误,因为没有方法undefined method '+' for nil:NilClass
。但是使用NilClass#+
会创建一个默认值为零的哈希值,因此此哈希值的不存在元素将计算为Hash.new(0)
而不是0
,现在当你第一次尝试增加一个元素时,一切正常。