Ruby では、すべてが objectです。私はそれを、すべてのものは から受け継がれ、BasicObject先祖がいると解釈しました。
しかし、ドル変数 ( $!、$1) には祖先がないことがわかりました。
ancestorで定義されているメソッドには応答しませんBasicObject。
ancestorRuby のコアにはメソッドがありません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
これは、オブジェクト自体ではなく、オブジェクトのクラスに先祖があるためです (オブジェクトが実際にクラス/モジュールでない限り)。
実際にはクラスancestorsで定義されています。ModuleModule または Class ( など) のインスタンスであるオブジェクトのみBasicObjectがこのメソッドを持ちます。したがって、 を呼び出すことはできませんが、または"something".ancestorsを実行することはできます。同じことが「ドル」変数にも当てはまります ( )。String.ancestors"something".class.ancestors$!.class.ancestors