Rubyのインスタンス変数、学び始めたばかりの頃は全然わかっていなかった。
その勘違いをサンプルコードとともにまとめてみた。
【勘違い】 インスタンス変数を参照、変更するメソッドは変数名と同じでなければならない。
以下の2つのコードは同じことである。
サンプル1
class Engineer
attr_accessor :name
def initialize(name)
@name = name
end
end
サンプル2
class Engineer
def initialize(name)
@name = name
end
def name
@name
end
def name=(name)
@name = name
end
end
出力した例
engineer = Engineer.new('aoki')
engineer.name
engineer.name = 'daisuke'
engineer.name
"aoki"
"daisuke"
今回の例で言えば、attr_accessorに:name
と書くだけでname
メソッドとname=
メソッドを定義したことになると言うだけで、@nameを参照、変更するのに別のメソッドがあってもいい
class Engineer
def initialize(name)
@name = name
end
def put_name
@name
end
def change_name(new_name)
@name = new_name
end
end
engineer = Engineer.new('aoki')
p engineer.put_name
engineer.change_name('daisuke')
p engineer.put_name
実行結果
"aoki"
"daisuke"
結論
今回の例で言えば、@nameと言うインスタンス変数に対して、@を取っ払ったname
でengineer.name
とインスタンス変数の値を出力しているが、このname
はあくまでもメソッド名なので、インスタンス変数と同じ名前でなくてもよい。