为了更好地理解 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 的魔法的一部分,但究竟是什么让它起作用?
最佳答案
当 ruby 解释器看到 obj.name = "A string
时,它会忽略 name
和 =
之间的空格并寻找一个obj
上名为 name=
的方法。
关于Ruby 的 attr_accessor 魔术方法定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14876635/