1
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 2019-10-02

#attr_accessorについて

attr_accesssorは外部からインスタンス変数を参照できるようにするために使用するメソッド。(厳密には、参照と書き込みの両方が行うことができる。)initializeで定義したインスタンス変数を外部から参照または、変更ができるようになる。
ex: attr_accessorの使用例

class Product
  attr_accessor :id
  
  def initialize(name)
    @id = name
  end

  def name
    "#{@id}-Product."
  end
end

# => コンソール
a=Product.new("sample")
=> #<Product:0x000056145a7f3d10 @id="sample">
a.name
=> "sample-Product."

#インスタンス変数を参照可能
a.id
=> "sample"
# インスタンス変数を変更可能
a.id = "red"
=> "red"
a.name
=> "red-Product."

###initializeとは? 
インスタンスを初期化したいときに実装したい処理を定義する場所。外部から呼び出せない。(デフォがprivateメソッド)引数をつければ、newする時に引数が必要となる。initialize内でインスタンス変数を作成すれば、クラス内でそのまま参照できる。しかし、インスタンス変数を外部から参照はできない。

class Product
  def initialize(name)
    @id = name
  end

  def name
    "#{@id}-Product."
  end
end

# => コンソール
a=Product.new('aa')
=> #<Product:0x0000558c6c72a508 @id="aa">
a.name
=> "aa-Product."
# 外部からの参照はできない
a.id
=> NoMethodError: undefined method 'id'

##initializeを使用せずにクラスを作成してみた。
initializeがないため引数をつけるとエラーが出る。初期化時の実行が定義されていないため!
引数なしで作成し、インスタンス変数に値を代入すれば、メソッドでもインスタンス変数をして出力できた。

class Product
  attr_accessor :id

  def name
    "#{@id}-Product."
  end
end

# => コンソール
# 引数をつけるとエラーが出る
a=Product.new("sample")
ArgumentError: wrong number of arguments (given 1, expected 0)
# 引数なしなら作成できる
a=Product.new          
=> #<Product:0x000055eca644b478>
# 値を代入していないためnil
a.id
=> nil
a.name
=> "-Product."
# attr_accessorがあるため、代入は可能
a.id = "sample"
=> "sample"
# 代入後はメソッドなども問題なく使用できる
a.id
=> "sample"
a.name
=> "sample-Product."
1
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
1
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?