【发布时间】:2013-01-30 08:40:46
【问题描述】:
为了更好地理解 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