【问题标题】:Is an object(instance of some class)'s method the same as the instance methods of its class in Ruby? [closed]对象(某个类的实例)的方法是否与 Ruby 中其类的实例方法相同? [关闭]
【发布时间】:2012-11-24 08:04:53
【问题描述】:

读完元编程 Ruby 中的“对象模型”一章后,我感到很困惑。 对象(某个类的实例)的方法是否与 Ruby 中其类的实例方法相同? 听起来是真的。因为我们知道对象的方法存储在其类中。

class W;end

W.methods == Class.instance_methods # => true

# Also

String.instance_methods == "abc".methods # => true

WClass 的一个实例。但是如果我重新打开W 并为其定义一个新方法,那就是混淆了。

class W
  def self.foo
     "bar"
  end
end

W.methods == Class.instance_methods  # => false

WClass的实例,W的方法是Class的实例方法。但是如果:foo 没有存储在Class 中,那么它存储在哪里?

【问题讨论】:

    标签: ruby metaprogramming


    【解决方案1】:

    方法wtf 存储在W 类中,而不是Ruby 的Class 类中。

    将其视为继承,当您在继承类中定义方法时,它在继承类中不可用。同样,当您在W 类中定义一个方法时,它在Class 类中不可用。 在继承类中添加方法不会影响继承类。

    虽然我不建议弄乱 Ruby 的内部 Class 类,但你可以通过猴子修补的方式为其添加方法:

    class Class
      def self.wtf
         "wtf"
      end
    end
    

    现在Class.methods.grep /wtf/ 将返回您添加的方法。

    【讨论】:

    • -1。这是错误的。 wtf 不存储在W 类中,它存储在W 类对象的单例类中。
    • 我想我误解了对象和类,现在我明白了,WClass 的对象,Class 也是 Class。他们是不同的对象。它们具有相同的方法,因为它们是 Class 的对象,如果我向 W 添加一个方法,它会像 @JörgWMittag 所说的那样添加到 W 类对象的单例类。这种方法是单例方法。我刚刚发现在 ruby​​ 中我们可以定义一个类似 def obj.method;end 的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    相关资源
    最近更新 更多