0

在 Ruby 中,一切都是对象。我将其解释为一切都继承自BasicObject并有祖先。

但我发现美元变量 ( $!, $1) 没有祖先。

他们不响应ancestor定义在BasicObject.

4

2 回答 2

5

Ruby 的核心中没有ancestor方法,我假设您的意思是ancestors. ancestors在 中定义Module,并且可以在模块或类对象上调用,而不是它们的实例。

$1.ancestors
#=> NoMethodError: undefined method `ancestors' for nil:NilClass
#     from (irb):4
#     from /Users/amarshall/.rbenv/versions/1.9.3-p125/bin/irb:12:in `<main>'

$1.class.ancestors
#=> [NilClass, Object, Kernel, BasicObject]

这不是全局变量独有的,适用于所有对象和变量类型。

重要的是要注意这Object.methods与以下内容不同Object.new.methods

Object.methods.include? :ancestors       #=> true
Object.new.methods.include? :ancestors   #=> false

这是因为对象的有祖先,而不是对象本身(除非对象实际上是类/模块)。

于 2012-04-06T17:07:32.160 回答
1

实际上ancestors是在类中定义的Module。只有作为 Module 或 Class 实例的对象(如BasicObject)具有此方法。所以你不能打电话"something".ancestors,但你可以做String.ancestorsor "something".class.ancestors。这同样适用于“美元”变量 ( $!.class.ancestors)。

于 2012-04-06T17:07:17.890 回答