Ruby をよりよく理解するために、attr_accessor メソッドを再作成することにしました。成功しました。Ruby のシンタックス シュガーに関する 1 つの詳細を除いて、これがどのように機能するかを理解できました。作成した attr_accessor メソッドは次のとおりです。
def attr_accessor(*attributes)
attributes.each do |a|
# Create a setter method (obj.name=)
setter = Proc.new do |val|
instance_variable_set("@#{a}", val)
end
# Create a getter method (obj.name)
getter = Proc.new do
instance_variable_get("@#{a}")
end
self.class.send(:define_method, "#{a}=", setter)
self.class.send(:define_method, "#{a}", getter)
end
end
私の見方では、obj.name
ゲッターとobj.name=
セッターの 2 つのメソッドを定義しただけです。しかし、IRB でコードを実行して呼び出すobj.name = "A string"
と、スペースなしでメソッドを定義しても機能します。
これが Ruby を定義する魔法の一部にすぎないことはわかっていますが、これが機能する正確な理由は何でしょうか?