http://www.sw.it.aoyama.ac.jp/2011/PB2/lecture11.html
© 2011 Martin J. Dürst 青山学院大学
attr_reader
, attr_writer
,
attr_accessor
でインスタンス変数にアクセスするメソッドを簡単に作成class ... end
内に def
... end
で定義した関数提出: 12月9日 (金曜日) 22:00 までに Moodle に
famous_accessors.rb
のファイル名で投稿
以前作った famous_people.rb
(正解例でも可能;
以前「発展問題」で行った danger を含む) を
famous_class.rb
で使った class Person
に置き換え、必要なアクセスメソッドを追加する。アクセスメソッドの一部は「手作り」、一部は
attr_...
で書く。
ヒント: 必要以上のアクセスメソッドは作らない
ヒント: 「掃除」されたデータファイル famous_cleaned.txt
をダウンロードして使用
正解例: famous_accessors.rb
手書きアクセスメソッドだけ: famous_accessors_by_hand.rb
自動生成アクセスメソッドだけ: famous_accessors_only.rb
提出: 12月9日 (金曜日) 22:00 までに Moodle に
famous_methods.rb
のファイル名で投稿
演習 1 のプログラムで bmi と danger の計算を関数からメソッドに変更しなさい。 更に、出力一行を文字列として返すメソッドも作りなさい。
ヒント:
if bmi <= 18.5
)bmi
)
による同一の値の計算の無駄は気にしない様にattr_...
は attr_reader
(インスタンス変数一つ) に減らされる正解例: famous_methods.rb
変数無し:
readlines.collect do |input_line| Person.new(input_line) end.sort_by do |person| person.weight end.each do |person| puts person.output_line end
do ... end
を { ... }
に変更:
readlines .collect { |input_line| Person.new(input_line) } .sort_by { |person| person.weight } .each { |person| puts person.output_line }
月名の配列:
month_names = [nil, 'January', 'February', 'March', 'April',
'May', 'June', 'July', 'August',
'September', 'October', 'November', 'December']
month_names[12]
→ December
逆のものが欲しい:
month_numbers['December']
→ 12
配列では不可能
month_numbers = { 'January' => 1, 'February' => 2, 'March' => 3, 'April' => 4, 'May' => 5, 'June' => 6, 'July' => 7, 'August' => 8, 'September' => 9, 'October' => 10, 'November' => 11, 'December' => 12 }
使用例:
month_numbers['December']
→ 12
(associative array)
Hash
(ハッシュ){
と }
)で囲む (配列は
[
と ]
)=>
で結ぶ (配列では不要){ }
(又は Hash.new
)使用 (値の取出し):
一般的な形: ハッシュ[キー]
具体例: month_numbers['December']
変更 (値の変更又は要素の追加):
一般的な形: ハッシュ[キー] =
値
具体例: month_numbers['December'] = 12
要素の削除:
一般的な形:
ハッシュ.delete(キー)
具体例: month_numbers.delete('December')
要素 (キー) の存在:
ハッシュ.has_key?(キー)
すべてのキー: ハッシュ.keys
(→
配列)
すべての値: ハッシュ.values
(→ 配列)
具体例: Translation = { 'height' => '身長', 'normal' =>
'普通体重', ...}
提出: 12月16日 (金曜日) 22:00 までに Moodle に
famous_hash.rb
のファイル名で投稿
以前作った famous_method.rb
(正解例でも可能)
に連想配列を追加し、出力する文字列 (height, weight, normal,
obese など)
を日本語に置き換えるようなプログラムを作成しなさい。
ヒント:
class Person
の前に連想配列を
Translation
という名前の定数で用意#{Translation[...]}
で output_line
メソッド内で使用発展問題: 複数の言語が使えるようにする (ハッシュのハッシュ)
提出: 12月16日 (金曜日) 22:00 までに Moodle に
words.rb
のファイル名で投稿
英語などの文書の入力 (<
ファイルまたは直接入力)
を行と単語に分解し、それぞれの単語の数を数えて、アルファベット順にきれいに出力しなさい。
入力例: Ottos Mops, President Obama's speaches
ヒント: 文字列の delete
メソッドで
,.!?;:'"
など記号を取り除く
ヒント: スペースを区切りに単語に分割
ヒント: 大文字・小文字の差をなくす
ヒント: 単語を最初に見つけるときともう一つ見つけるときの処理を分ける
発展問題: 単語の頻度順で出力