7-5-2 健康診断を行うクラスをアクセサメソッドを使って実装しよう
インスタンス変数に外部からデータを指定するプログラムを保存する
以下のようにプログラムを記述し、ファイル名をmedical_examinator.rb
で保存します。
# 健康診断を行うクラスをアクセサメソッドを使って実装しよう class MedicalExaminator def height=(height) @height = height end end # インスタンスを生成 examinator = MedicalExaminator.new # 身長を外部から指定 examinator.height = 170 # インスタンスを出力 p examinator
インスタンス変数に外部からデータを指定するプログラムを実行する
コマンドライン上で保存したプログラムを実行します。実行結果に#<MedicalExaminator:0x007f86948992f8 @height=170>
などと表示されます。
$ ruby medical_examinator.rb
#<MedicalExaminator:0x007f86948992f8 @height=170>
インスタンスからメソッドを呼び出して表示するプログラムを修正する
インスタンスからheight=
メソッドを呼び出して表示するプログラムに修正して保存します。
# 健康診断を行うクラスをアクセサメソッドを使って実装しよう class MedicalExaminator def height=(height) @height = height end end # インスタンスを生成 examinator = MedicalExaminator.new # 身長を外部から指定 examinator.height = 170 # heightを出力 p examinator.height
インスタンスからメソッドを呼び出して表示するよう修正したプログラムを実行する
コマンドライン上で修正したプログラムを実行します。実行結果にheight
メソッドが存在しないことをあらわすNoMethodError
が表示されます。
$ ruby medical_examinator.rb medical_examinator2.rb:15:in `<main>': undefined method `height' for #<MedicalExaminator:0x007fb0a2185470 @height=170> (NoMethodError) Did you mean? height=
MedicalExaminator
クラスにheight
メソッドを追加するようプログラムを修正する
以下のようにプログラムを修正し保存します。
# 健康診断を行うクラスをアクセサメソッドを使って実装しよう class MedicalExaminator def height=(height) @height = height end def height @height end end # インスタンスを生成 examinator = MedicalExaminator.new # 身長を外部から指定 examinator.height = 170 # heightを出力 p examinator.height
アクセサメソッドを追加したプログラムを実行する
コマンドライン上で修正したプログラムを実行します。実行結果に170
が表示されます。
$ ruby medical_examinator.rb
170
attr_accessor
を使ったプログラムに修正する
以下のようにプログラムを修正し保存します。
# 健康診断を行うクラスをアクセサメソッドを使って実装しよう class MedicalExaminator attr_accessor :height end # インスタンスを生成 examinator = MedicalExaminator.new # 身長を外部から指定 examinator.height = 170 # heightを出力 p examinator.height
attr_accessor
を使うよう修正したプログラムを実行する
コマンドライン上で修正したプログラムを実行します。実行結果に170
が表示されます。
$ ruby medical_examinator.rb
170
attr_writer
を使ったプログラムに修正する
以下のようにプログラムを修正し保存します。
# 健康診断を行うクラスをアクセサメソッドを使って実装しよう class MedicalExaminator attr_writer :height end # インスタンスを生成 examinator = MedicalExaminator.new # 身長を外部から指定 examinator.height = 170 # heightを出力 p examinator.height
attr_writer
を使って修正したプログラムを実行する
コマンドライン上で修正したプログラムを実行します。実行結果にheight
メソッドが存在しないことをあらわすNoMethodError
が表示されます。
$ ruby medical_examinator.rb medical_examinator.rb:13:in `<main>': undefined method `height' for #<MedicalExaminator:0x007fd9f28b5578 @height=170> (NoMethodError) Did you mean? height=
attr_reader
を使ったプログラムに修正する
以下のようにプログラムを修正し保存します。
# 健康診断を行うクラスをアクセサメソッドを使って実装しよう class MedicalExaminator attr_reader :height def initialize(height) @height = height end end # インスタンスを生成 examinator = MedicalExaminator.new(170) # heightを出力 p examinator.height # 身長を外部から指定 examinator.height = 180
attr_reader
を使って修正したプログラムを実行する
コマンドライン上で修正したプログラムを実行します。実行結果に170
が表示された後、height=
メソッドが存在しないことをあらわすNoMethodError
が表示されます。
$ ruby medical_examinator.rb 170 medical_examinator.rb:17:in `<main>': undefined method `height=' for #<MedicalExaminator:0x007fe8238c51f0 @height=170> (NoMethodError) Did you mean? height
アクセサメソッドをすべて使ったプログラムに修正する
以下のようにプログラムを修正し保存します。
# 健康診断を行うクラスをアクセサメソッドを使って実装しよう class MedicalExaminator attr_accessor :height, :weight, :medical_check attr_reader :name, :age, :sex, :result_examination attr_writer :finished def initialize(name, age, sex) @name = name @age = age @sex = sex end def input_result unless @finished p '検診はまだ終わっていません' return end @result_examination = { name: name, age: age, sex: sex, height: height, weight: weight, medical_check: medical_check } end end examinator = MedicalExaminator.new('山田太郎', 30, :male) # 氏名・年齢・性別を確認 p examinator.name p examinator.age p examinator.sex # 身長・体重・診察結果を指定 examinator.height = 170 examinator.weight = 60 examinator.medical_check = '異常なし' # 指定した身長・体重・診察結果を表示 p examinator.height p examinator.weight p examinator.medical_check # 健康診断結果を指定 examinator.input_result # 健康診断を終了 examinator.finished = true # 健康診断結果を指定 examinator.input_result # 健康診断結果を表示 p examinator.result_examination
アクセサメソッドをすべて使って修正したプログラムを実行する
コマンドライン上で修正したプログラムを実行します。実行結果に指定した氏名、年齢、性別、身長、体重、診察結果が表示されます。
その後、"異常なし"
、"検診はまだ終わっていません"
との文字列が表示され、最後に健康診断結果を表すハッシュが表示されます。
$ ruby -Ku medical_examinator.rb # Windowsの場合-Kuオプション必須 "山田太郎" 30 :male 170 60 "異常なし" "検診はまだ終わっていません" {:name=>"山田太郎", :age=>30, :sex=>:male, :height=>170, :weight=>60, :medical_check=>"異常なし"}