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

ste*_*ang 0 ruby oop object

在Ruby中,一切都是对象.我把它解释为一切都是从BasicObject祖先那里继承而来的.

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

它们不响应ancestor定义的方法BasicObject.

And*_*all 5

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

$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]
Run Code Online (Sandbox Code Playgroud)

这不是全局变量所特有的,并且适用于所有对象和变量类型.

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

Object.methods.include? :ancestors       #=> true
Object.new.methods.include? :ancestors   #=> false
Run Code Online (Sandbox Code Playgroud)

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