【问题标题】:Why dollar variable has no ancestors even in Ruby?为什么即使在 Ruby 中美元变量也没有祖先?
【发布时间】:2012-04-20 06:09:55
【问题描述】:

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

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

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

【问题讨论】:

  • 在 Ruby 中,变量没有类,本质上不是对象。

标签: ruby oop object


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 2023-01-08
      • 2021-03-19
      • 1970-01-01
      相关资源
      最近更新 更多