概要
メタプログラミングの学習を進めてて、つまずいたのでメモ程度に残していきます。
initializeメソッドとセッターメソッドを深掘りします。
initializeメソッドとセッターメソッドの定義
initializeメソッドを定義しセッターメソッドを定義すると次のようになります。
class Car
attr_accessor :name
def initialize(name)
@name = name
end
def say
"私の車は#{name}です"
end
end
my_car1 = Car.new("toyota")
p my_car1.name
p my_car1.say
# =>"toyota"
# =>"私の車はtoyotaです
通常ですと、変数の受け渡しにインスタンス変数(@name)を使用しますが、
これをローカル変数に変えてみます。
class Car
attr_accessor :name
def initialize(name)
name = name
end
def say
"私の車は#{name}です"
end
end
my_car1 = Car.new("toyota")
p my_car1.name
p my_car1.say
# => nil
# => "私の車はです"
nameメソッドを呼び出した時点でnilが発生します。これは、インスタンス変数であるnameがローカル変数となっているため、class内で変数を共有できなかったことが問題となっています。
そこで、セッターメソッドを明示的に指定することで、インスタンス変数を保持することができます。
selfを使用してレシーバを指定します。
class Car
attr_accessor :name
def initialize(name)
self.name= name #=> name= メソッドを呼び出してる
end
def say
"私の車は#{name}です"
end
end
my_car1 = Car.new("toyota")
p my_car1.name # =>"toyota"
p my_car1.say # =>"私の車はtoyotaです"
これで、明示的にセッターメソッドを呼び出していることがわかります。
ちなみにsayメソッドの中にあるnameインスタンスにselfを使用しても呼び出すことができますが、使用しなくでも呼び出しができます。
・
・
・
def say
"私の車は#{self.name}です"
end
.
.
.
ゲッターメソッドに使用するとコードが煩雑になりますので、使用する必要がないことも覚えておきましょう。