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=>"異常なし"}