##attr_accessorとは
インスタンス変数を直接変更して操作ができるようにするもの。
##簡単に説明
例えば、Perosonクラスがあったとしましょう。
class Person
def initialize name
@name = name
end
def say
puts "私の名前は" + @name + "です"
end
end
person = Person.new "taro"
person.say
実行結果
私の名前はtaroです
①personインスタンスを生成した時にインスタンス変数(@name)
にtaroが入る。
②personに対してsayメソッドを呼び出して値を保持したインスタンス変数(@name)
を表示。
という流れです。
しかし、クラスの外からインスタンス変数(ここでいう@name
)を変更させたいと思ったとき、どのようにすれば良いのでしょうか。
次の例をみてみましょう。
class Person
def initialize name
@name = name
end
def say
puts "私の名前は" + @name + "です"
end
end
person = Person.new "taro"
person.name = "hanako" #インスタンス変数の値を更新
person.say
実行結果
undefined method `name=' for #<Person:0x007fad1d0e35b8 @name="taro"> (NoMethodError)
インスタンスから直接nameを変えようとしましたが、nameなんてメソッド定義してねぇよ!と怒られます。
もちろん、person.@name = "hanako"
とするのもダメです。
これはインスタンス変数にアクセスできていないからです。
そこでインスタンス変数にアクセスさせるために使うのが、attr_accessorというもの。
今回はインスタンス変数である@name
の値を変えたいので、次のように追記します。
class Person
attr_accessor :name #追加
def initialize name
@name = name
end
def say
puts "私の名前は" + @name + "です"
end
end
person = Person.new "taro"
person.name = "hanako" #インスタンス変数の値を上書き
person.say
実行結果
私の名前はhanakoです
これでクラス外からインスタンス変数であるnameを操作できるようになりました。
attr_accessor : (インスタンス変数) とすれば、指定されたインスタンス変数が外部からでも変更できるようになるので必要に応じて設定するようにしてみましょう。