##インスタンス変数とは
同じインスタンスの内部で共有される変数
class Food
def initialize(name)
#インスタンス作成時に渡された名前をインスタンス変数に保存する
@name = name
end
def eat
"I will eat an #{@name}"
end
end
food = Food.new('apple')
food.hello #=> "I will eat an apple"
インスタンス変数はクラスの外部から参照することができない!
class Food
def initialize(name)
@name = name
end
#@nameを外部から参照するためのメソッド
def name
@name
end
end
food = Food.new('apple')
#nameメソッドを経由して@nameの内容を取得
food.name #=> "apple"
インスタンス変数の内容を外部から変更したい場合も変更用のメソッドを定義
class Food
def initialize(name)
@name = name
end
#@nameを外部から参照するためのメソッド
def name
@name
end
#@nameを外部から変更するためのメソッド
def name=(value)
@name = value
end
end
food = Food.new('apple')
#変数に代入しているように見えるが、実際はname=メソッドを呼び出している。
food.name = 'banana'
#nameメソッドを経由して@nameの内容を取得
food.name #=> "banana"
インスタンス変数の値を読み書きするメソッドのことを「アクセサメソッド」と呼ぶ。
これらのメソッドをいちいち書くのは面倒。
そこで登場するのが「attr_accessorメソッド」
##attr_accessorメソッド
class Food
#@nameを読み書きするメソッドが自動的に定義される
attr_accessor :name
def initialize(name)
@name = name
end
#@nameを外部から参照するためのメソッド
#def name
#@name
#end
#@nameを外部から変更するためのメソッド
#def name=(value)
#@name = value
#end
end
food = Food.new('apple')
#@nameを変更する
food.name = 'banana'
#@nameを参照する
food.name #=> "banana"
インスタンス変数の内容を読み取り専用にしたい場合は「attr_reader」
書き込み専用にしたい場合は「attr_writer」
参照
プロを目指す人のためのRuby入門