attr_accssorとは
attr_accessorメソッドは、クラスやモジュールにインスタンス変数を読み書きするためのアクセサメソッドを定義します。引数には、インスタンス変数名をシンボルか文字列で指定します(複数指定できます)。戻り値はnilです。
引用元 https://ref.xaio.jp/ruby/classes/module/attr_accessor
コード例
class Cigarettes
attr_accessor :price
def initialize(price)
@price = price
end
end
# インスタンス生成
cigarettes = Cigarettes.new(450)
p cigarettes.price
# => 450
cigarettes.price = 470
p cigarettes.price
# => 470
attr_accessor
で、getter
とsetter
をいっぺんに定義するイメージ。
ちなみに、attr_accessor
を用いない場合は、下記のようにする必要がある。
class Cigarettes
def price
@price
end
def price=(val)
@price = val
end
(後略)
def price=(val)
は初めて見たとき戸惑ってしまったが、
cigarettes.price = 470
のように、price
への代入式を書いた時に呼び出される(setter
)。
attr_readerとattr_writer
関連して、attr_reader
とattr_writer
も存在する。
attr_reader
はインスタンス変数の読み出し専用アクセサを定義できる。
class Cigarettes
attr_reader :price
def initialize(price)
@price = price
end
end
# インスタンス生成
cigarettes = Cigarettes.new(450)
p cigarettes.price
# => 450
cigarettes.price = 470
# => `<main>': undefined method `price=' for #<Cigarettes:0x00007ff50b048910 @price=480> (NoMethodError)
インスタンス生成後に、インスタンス変数の値を変えたくない場合に使えそう。
attr_writer
は、インスタンス変数の書き込み専用アクセサを定義する。
class Cigarettes
attr_writer :price
def initialize(price)
@price = price
end
end
# インスタンス生成
cigarettes = Cigarettes.new(450)
p cigarettes.price
=> undefined method `price' for #<Cigarettes:0x00007f9685054420 @price=450> (NoMethodError)
atter_reader
と逆で、インスタンス生成時にインスタンス変数の値を設定した後は、読み出すことはできない。