コードを見ていて「attr_accessor」について理解できていないと感じたので、調べたことのメモとして書きます。
attr_accessorとは
-
attr_accessorメソッドは、クラスやモジュールに
インスタンス変数
を読み書きするためのアクセサメソッドを定義する。
引数には、インスタンス変数名
をシンボルか文字列で指定。(複数指定できる)。 -
定義されたメソッドは、シンボルの名前の先頭に「@」を付加したインスタンス変数の値を取り出す。
-
戻り値はnil
-
インスタンス変数
とは、オブジェクトの中で値を保存しておくための利用される変数。
class クラス名
def メソッド名
@name = 値
end
# 「@name」がインスタンス変数
end
attr_accessorの使い方
class Book
attr_accessor :title, :price
# クラス内でシンボルを渡しアクセサメソッドを定義。
# 一度に複数渡すことが出来、それぞれのアクセサメソッドが追加される。
def initialize(title, price)
@title = title; @price = price
end
end
book = Book.new("Programming Ruby", 1980)
puts book.title
book.price = 2000
puts book.price
# 結果
=> Programming Ruby
=> 2000
上記の例は、次のように記述するのと同じ。
class Book
def title
@title
end
def title=(val)
@title = val
end
def price
@price
end
def price=(val)
@price = val
end
- title=(val) や price=(val)は、book.title = “test” や book.price = 1500などの
代入式を書いた時に呼び出されるメソッド。
attr_accessorで何が出来るのか
- アクセサメソッドを定義することで、インスタンス変数に外部からアクセスできるようになる。
- アクセサメソッドのないインスタンス変数にアクセスしようとした場合、NoMethodError が発生してしまう。
class Car
def initialize(carname="クルマ")
@name = carname
end
attr_accessor :name
end
car = Car.new()
car.name = "civic"
print(car.name)
# 結果
=> "civic"
上記のように、「オブジェクト名.変数名」で参照したり更新したりが直接行える。
まだ完全には理解できてないので、随時更新予定です。