オブジェクト指向: attr_reader, initialize
#RubySilver
initialize: インスタンス作成時、そのインスタンス変数の初期値を設定する。
code: .rb
class Drink
def initialize(name)
@name = name
end
end
# インスタンス作成
drink = Drink.new("カフェラテ") # 引数で@nameの値を渡さないとエラーになる
=> #<Drink:0x000000011193c148 @name="カフェラテ">
# ⚠️しかしこの定義だけでは、"クラスの外部から"nameを取得できない
drink.name
=> undefined method `name' for #<Drink:0x000000011193c148 @name="カフェラテ"> (NoMethodError)
→クラスの外部から読み込みを可能にしてくれるattr_readerの出番!
code: .rb
class Drink
def initialize(name)
@name = name
end
# インスタンス変数@name を読み取るメソッド
def name
@name
end
end
# ↓ attr_reader に書き換え
class Drink
def initialize(name)
@name = name
end
# 書き換え
attr_reader :name
end
# インスタンス作成
drink = Drink.new("カフェラテ")
# nameを取得できる!
drink.name
=> "カフェラテ"
# ⚠️しかしこの定義だけでは、nameの書き換えができない
drink.name = "ジュース"
=> undefined method `name=' for #<Drink:0x000000010cca00c8 @name="カフェラテ"> (NoMethodError)
→クラスの外部から書き換えを可能にする、attr_writerの出番!
code:.rb
class Drink
def initialize(name)
@name = name
end
attr_reader :name
# インスタンス変数@name の値を書き換えるメソッド
def name=(text)
@name = text
end
end
# ↓ attr_writer に書き換え
class Drink
def initialize(name)
@name = name
end
attr_reader :name
# 書き換え
attr_writer :name
end
end
# インスタンス作成
drink = Drink.new("カフェラテ")
=> #<Drink:0x000000010d2240a8 @name="カフェラテ">
# 値を書き換えるメソッドを定義したので、クラスの外から変更できる
drink.name = "ジュース"
=> "ジュース"
drink
=> #<Drink:0x000000010d2240a8 @name="ジュース"> # ちゃんと"ジュース"に変わってる✨
→さらに省略して、attr_reader + attr_writer = attr_accessor 一行で書ける。
code: .rb
class Drink
def initialize(name)
@name = name
end
# 読み込みと書き換え両方できる
attr_accessor :name
end