Ruby的attr_accessor魔术方法定义

时间:2013-02-14 14:06:42

标签: ruby

为了更好地理解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的魔力的一部分,但究竟是什么让它起作用?

2 个答案:

答案 0 :(得分:2)

当ruby解释器看到obj.name = "A string时,它会忽略name=之间的空格,并在name=上查找名为obj的方法。

答案 1 :(得分:-1)

没关系,'字符串'是一个非常好的消息名称,只需尝试

obj.send "A string" # ^_^

您甚至可以使用数字:

o = Object.new
o.define_singleton_method "555" do "kokot" end
o.send "555"