在Ruby中,一切都是对象。我将其解释为所有内容都是从BasicObject
继承并拥有祖先。
但我发现美元变量($!
,$1
)没有祖先。
他们不响应ancestor
上定义的BasicObject
方法。
答案 0 :(得分:5)
Ruby的核心中没有ancestor
方法,我假设您的意思是ancestors
。 ancestors
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.methods
与Object.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
)。