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