アプリ版:「スタンプのみでお礼する」機能のリリースについて

たのしいRuby P252に掲載されていた、例題
「ハッシュ(単語数を数える)」の解説を読んでも
意味が分からなかったので教えてください。



■例題word_count.rb
1:# 単語数のカウント
2:
3: count = Hash.new(0)
4:
5:## 単語の集計
6:while line = gets
7: words = line.split
8: words.each{|word|
9: count[word] += 1
10: }
11:end
12:
13:## 結果の出力
14:count.sort{|a,b|
15: a[1] <=> b[1]
16:}.each{|key, value|
17: print "#{key}: #{value}\n"
18}



■疑問1.
解説には、

# 3行目で出現回数を記録するハッシュcountを作ります。
# countは、キーが単語、値がその単語が出現した回数を表します。

と書かれているのですが、「キーが単語、値がその単語が出現した回数を表します」
の内容が理解できません。newしただけなのに、どうして、
キーと値の内容が決まるのでしょうか?



■疑問2.
解説には、

# 8行目からの繰り返しでは、それぞれの単語をキーにして、countから出現回数を取り出し、
# +1します。

と書かれているのですが、「count[word] += 1」
の内容が理解できません。
作成したハッシュcountと、getsメソッドで読み込み単語単位に分割した配列wordsとが、
どこで関連付けされているのかが、分かりません。



■疑問3.
解説には、

# ruby word_count.rb README

という形で、Rubyに同梱されているREADMEファイルの単語数を調べた
実行結果が掲載されているのですが、
そのときの具体的な処理の流れが分かりません。
「ruby word_count.rb README」と書くだけで、
処理の流れが、getsの所まできたとき、
自動的に指定ファイル名を判断し、
読み込みを始めるということなのでしょうか。

A 回答 (1件)

>と書かれているのですが、「キーが単語、値がその単語が出現した回数を表します」


>の内容が理解できません。newしただけなのに、どうして、
>キーと値の内容が決まるのでしょうか?

別に決まってはいません。
その後のコードで count の key と value をそのように解釈して利用しているということです。

>作成したハッシュcountと、getsメソッドで読み込み単語単位に分割した配列wordsとが、
>どこで関連付けされているのかが、分かりません。

配列 words を一単語ずつ each メソッドで処理することで関連づけています。
Hash.new(0) でデフォルト値が 0 であることに注意しましょう。

>「ruby word_count.rb README」と書くだけで、
> 処理の流れが、getsの所まできたとき、
> 自動的に指定ファイル名を判断し、
> 読み込みを始めるということなのでしょうか。

gets とは ARGF.gets と同じです。

この回答への補足

ご回答ありがとうございました。

補足日時:2008/12/05 08:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!