为什么美元变量即使在Ruby中也没有祖先?

时间:2012-04-06 16:59:40

标签: ruby oop object

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

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

他们不响应ancestor上定义的BasicObject方法。

2 个答案:

答案 0 :(得分:5)

Ruby的核心中没有ancestor方法,我假设您的意思是ancestorsancestors is defined in 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.methodsObject.new.methods不同:

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

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

答案 1 :(得分:1)

实际上ancestors类中定义了Module。只有作为Module或Class实例的对象(如BasicObject)才有此方法。因此,您无法致电"something".ancestors,但可以String.ancestors"something".class.ancestors。这同样适用于'美元'变量($!.class.ancestors)。