0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rubyのゲッター、セッター、initializeについて

Last updated at Posted at 2019-07-07
car.rb
class Car

  def initialize(color)
    @color = color
  end

  # ゲッター
  def color
    @color
  end

  # セッター
  def color=(color)
    @color = color
  end
end

# インスタンス化する際にinitializeメソッドに値を渡す
car1 = Car.new("red")
car2 = Car.new("green")
car3 = Car.new("blue")
# car1.color = "gray"

# colorを呼び出すと代入された値が表示される
puts car1.color
puts car2.color
puts car3.color

↑こういうrbファイルがあったとする。

これをターミナル上で実行ruby car.rbすると下記のような結果になる

red
green
blue

疑問に思ったこと

initialize(color) は引数(color)
car1 = Car.new("red")の("red")を受け取ることができている。

「えっ・・・これセッターを書く意味ある?」と疑問に思ったのだ。
試しにセッターをコメントアウトして、再度ターミナルの結果を見てみる

car.rb
class Car

  def initialize(color)
    @color = color
  end

  # ゲッター
  def color
    @color
  end

  # セッター
  # def color=(color)
  #   @color = color
  # end
end

# インスタンス化する際にinitializeメソッドに値を渡す
car1 = Car.new("red")
car2 = Car.new("green")
car3 = Car.new("blue")
# car1.color = "gray"

# colorを呼び出すと代入された値が表示される
puts car1.color
puts car2.color
puts car3.color

結果↓

red
green
blue

「えっ・・・これホンマにセッター書く意味ないやん、、、
試しにcar1.color = "gray" でcar1.colorの値もちゃんと返ってくるか確かめてみよ」

car.rb
class Car

  def initialize(color)
    @color = color
  end

  # ゲッター
  def color
    @color
  end

  # セッター
  # def color=(color)
  #   @color = color
  # end
end

# インスタンス化する際にinitializeメソッドに値を渡す
car1 = Car.new("red")
car2 = Car.new("green")
car3 = Car.new("blue")
car1.color = "gray" #ここのコメントアウト外した

# colorを呼び出すと代入された値が表示される
puts car1.color
puts car2.color
puts car3.color

結果↓

Traceback (most recent call last):
class.rb:22:in `<main>': undefined method `color=' for #<Car:0x00007ffe6b172520 @color="red"> (NoMethodError)
Did you mean?  color

「おっ!エラーはいた。(良かった〜)」

わかったこと

initializeメソッドは初期値を受けとれるだけ。
なので今回のcar1.color = "gray"のように後から代入する可能性も考えると
セッターの記述は必要。

ちなみにセッターのコメントアウトも外して、再度実行するとcar1.colorの出力値を更新することができた。

car.rb
class Car

  def initialize(color)
    @color = color
  end

  # ゲッター
  def color
    @color
  end

  # セッターのコメントアウトを外した
  def color=(color)
    @color = color
  end
end

# インスタンス化する際にinitializeメソッドに値を渡す
car1 = Car.new("red")
car2 = Car.new("green")
car3 = Car.new("blue")
car1.color = "gray"

# colorを呼び出すと代入された値が表示される
puts car1.color
puts car2.color
puts car3.color

結果↓

gray
green
blue

オブジェクト指向って難しいね〜(大満足)

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?