【问题标题】:Ruby's attr_accessor magic method definingRuby 的 attr_accessor 魔术方法定义
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 呃哦,我的阅读理解,我似乎回答错了问题:],+1 给你。
    【解决方案2】:

    没关系,“字符串”是一个非常好的消息名称,试试吧

    obj.send "A string" # ^_^
    

    你甚至可以使用数字:

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

    【讨论】:

    • 好的,我回答的问题与你在这里问的不同:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多