0

Ruby では、すべてが objectです。私はそれを、すべてのものは から受け継がれ、BasicObject先祖がいると解釈しました。

しかし、ドル変数 ( $!$1) には祖先がないことがわかりました。

ancestorで定義されているメソッドには応答しませんBasicObject

4

2 に答える 2

5

ancestorRuby のコアにはメソッドがありませんancestorsancestorsで定義されており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

これは、オブジェクト自体ではなく、オブジェクトのクラスに先祖があるためです (オブジェクトが実際にクラス/モジュールでない限り)。

于 2012-04-06T17:07:32.160 に答える
1

実際にはクラスancestorsで定義されています。ModuleModule または Class ( など) のインスタンスであるオブジェクトのみBasicObjectがこのメソッドを持ちます。したがって、 を呼び出すことはできませんが、または"something".ancestorsを実行することはできます。同じことが「ドル」変数にも当てはまります ( )。String.ancestors"something".class.ancestors$!.class.ancestors

于 2012-04-06T17:07:17.890 に答える