【问题标题】:How can Class be of the Class class and not have Class instance methods?Class 怎么可能是 Class 类而没有 Class 实例方法呢?
【发布时间】:2011-11-24 14:21:09
【问题描述】:

我正在研究如何实现 Ruby 解释器,但出现了一个问题,但我还没有得到答案。这就是标题中的那个:因为Class (r_cClass) 将super 设置为自身(忽略元类,因为实际上superr_cClass 的元类),如果我向@987654326 发送一个方法@object,这将在Class'类的方法表中查找。但是Class'类是Class,所以我不应该最终寻找Class的实例方法吗?但事实并非如此,因为在文档中Class 类方法和Class 实例方法是分开的。在 Ruby 的 eval.c 中的 search_method 中,我没有找到对 Class 类的任何特殊检查。任何人都可以对此有所了解吗?

【问题讨论】:

  • 在这么抽象的问题中,给出具体的例子可能是个好主意,比如一个实例方法的例子和一个类方法的例子。

标签: ruby class methods internals metaclass


【解决方案1】:

你对它应该如何工作的看法似乎是正确的,但我不确定你为什么认为它不会那样工作。

在 Ruby 1.8.7 中:

irb> a = Class.new.methods - Object.new.methods
=> [... 36 element array ...]
irb> b = Class.methods - Object.new.methods
=> [... 37 element array ...]
irb> b - a
=> ["nesting"]

一个普通的类实例(Class.new)有 36 个实例方法。如果我看 Class 本身,它也是一个普通的类实例,它有相同的 36 个实例方法,加上 1 个额外的类方法(嵌套),它之所以存在,只是因为它是从它的超类 Module 继承而来的。

请注意,将实例方法添加到 Class 会自动将其添加为类方法,但将类添加到 Class 的元类不会。

irb> class Class ; def everywhere ; true ; end ; end
irb> class << Class ; def only_singleton ; true ; end ; end
irb> Class.everywhere
=> true
irb> Class.new.everywhere
=> true
irb> Class.only_singleton
=> true
irb> Class.new.only_singleton
NoMethodError: undefined method 'only_in_singleton' for #<Class:0x4800ac8>

【讨论】:

  • 所以方法其实是一样的。实际上,源代码中没有任何线索导致我产生这个想法。只是 Ruby 文档清楚地将 Class 实例方法与 Class 单例方法分开。这种分离仅仅是为了清楚吗?
  • 单例方法是指类方法?
  • 好吧,我想我的回答有点错误,因为我相信一种方法(新)是不同的。 Class.new 返回一个新的匿名类; Class.new.new 返回该匿名类的实例。 new 的“公共类方法”版本(返回一个新的匿名类)将在 Class 的元类中定义。
  • 在 cmets 中编写代码很困难,所以我更新了我的答案,举了一个向元类添加方法的示例(使其对 Class 可用,但对 Class 的实例不可用)。
  • 这对我来说很清楚,谢谢。 new 被 Class 的元类覆盖,但所有其他方法都相同。
猜你喜欢
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多