5
3

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.

attr_accessorメソッドの使い方

Last updated at Posted at 2018-12-29

コードを見ていて「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"

上記のように、「オブジェクト名.変数名」で参照したり更新したりが直接行える。

まだ完全には理解できてないので、随時更新予定です。

5
3
0

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
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?