-1

我不明白 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}方法起作用吗?

4

2 回答 2

5

设置哈希值的语法是:

hash_name[key] = value

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

frequencies = Hash.new(0)

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

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

通过遍历所有单词来利用默认值,将它们用作键,即使它们最初不存在,并增加frequency[x]散列键x(当前单词)的散列值。如果尚未设置,则从0您要计算的内容开始。这是因为+=将真正意味着当值尚未设置时frequencies[x] = frequencies[x] + 1返回的初始值将是.frequencies[x]0

于 2013-09-15T21:54:25.130 回答
1

我不确定您的问题到底出在哪里,但希望这会有所帮助。

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

是的,它确实。在行

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

哈希被调用frequencies,键是x. 该键的值由表达式返回frequencies[x]

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

+=具有其通常含义为 Ruby 缩写,因此var += 1var = var + 1.

frequencies[x] += 1也是如此frequencies[x] = frequencies[x] + 1:它将 . 标识的散列元素的当前值加一x

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

于 2013-09-15T22:19:32.067 回答