2

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

4

2 回答 2

2

When the ruby interpreter sees obj.name = "A string, it will ignore the space between name and = and look for a method named name= on your obj.

于 2013-02-14T14:47:01.490 回答
-1

没关系,'A string' 是一个非常好的消息名称,试试

obj.send "A string" # ^_^

你甚至可以使用数字:

o = Object.new
o.define_singleton_method "555" do "kokot" end
o.send "555"
于 2013-02-14T14:45:37.237 回答