初めに
attr_accessorってrubyの勉強してたら結構出てきますよね。
最近になってやっとattr_accessorがどういった仕組みをしているかがわかりました。
attr_accessorの使い方
attr_accessorはこんな感じで使いますよね
class User
attr_accessor :age
end
user = User.new
user.age = 18
p user.age
=> 18
attr_accessorの仕組み
まずさっきのコードは
class User
def age=(value)
@age = value
end
def age
@age
end
end
user = User.new
user.age = 18
p user.age
=> 18
これと同じ
それでattr_accessor :ageの一行でどのように実装しているのかというと
class Object
def self.new_accessor(*args)
args.each do |attr|
define_method(attr) do
instance_variable_get("@#{attr}")
end
define_method("#{attr}=") do |value|
instance_variable_set("@#{attr}", value)
end
end
end
end
class User
new_accessor :age, :name
end
user = User.new
user.age = 19
user.name = 'taro'
p user.age
p user.name
=> 19
=> 'taro'
みたいな感じです(多分…)
まずnew_accessorというクラスメソッドをObjectクラスをオープンして作っています。
そうすることによってObjectクラスが継承されているクラスすべてで使うことができます。
new_accessorの中身はdefine_methodでattrというメソッドとattr=というメソッドを作っています。
attrではinstance_variable_get で @attr の値を取得していて
attr=ではinstance_variable_set で @attr に値をセットしています
(attrは*argから得た値で今回の場合はageとnameです)
*argで不特定の個数の値をとることによって何個でもメソッドが作ることができます。
素晴らしい!!
なにか間違っていることがあるかもしれないのでその際はご指摘いただけたらと思います。