#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."