27
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Ruby】attr_accessor(attr_reader, attr_writer)について調べた

Posted at

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で、gettersetterをいっぺんに定義するイメージ。
ちなみに、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_readerattr_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と逆で、インスタンス生成時にインスタンス変数の値を設定した後は、読み出すことはできない。

27
30
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?