-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( を返します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 += 1と同じですvar = var + 1

で識別さfrequencies[x] += 1れるfrequencies[x] = frequencies[x] + 1ハッシュ要素の現在の値に 1 を追加しxます。

パズルの最後のピースは、frequencies作成された方法です。通常、割り当てられていないハッシュ要素にアクセスすると、 が返されますnil。method がないため+=、通常、 を使用するとエラーが発生します。しかし、 using を使用すると、デフォルト値がゼロのハッシュが作成されるため、このハッシュの存在しない要素はではなくとして評価され、要素を初めてインクリメントしようとすると、すべてが正常に機能するようになります。undefined method '+' for nil:NilClassNilClass#+Hash.new(0)0nil

于 2013-09-15T22:19:32.067 に答える