为了更好地理解 Ruby,我决定重新创建 attr_accessor 方法。成功。我现在明白了它是如何工作的,除了一个关于 Ruby 语法糖的细节。这是我创建的 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
作为 getter 和obj.name=
作为 setter。但是当我在 IRB 中执行代码并调用obj.name = "A string"
它时,它仍然有效,即使我定义了没有空格的方法!
我知道这只是定义 Ruby 的魔力的一部分,但究竟是什么让它起作用呢?