これらは同じであるべきではありませんか?
p String.ancestors
p String.class.ancestors
代わりに私は得る:
[String, Comparable, Object, Kernel, BasicObject]
[Class, Module, Object, Kernel, BasicObject]
ご協力いただきありがとうございます。
これらは同じであるべきではありませんか?
p String.ancestors
p String.class.ancestors
代わりに私は得る:
[String, Comparable, Object, Kernel, BasicObject]
[Class, Module, Object, Kernel, BasicObject]
ご協力いただきありがとうございます。
これらは同じではありませんか?
いいえ、すべきではありません、なぜですか?
との違いはとの違いFooとFoo.class同じですff.class
class Foo; end
f = Foo.new
f # => #<Foo:0x007ff289849170>
f.class # => Foo
Foo # => Foo
Foo.class # => Class
Fooはオブジェクトであり、Foo.classはそのクラスです。
ご覧のとおり、クラスとクラスオブクラスフォークの階層はですObject。ルビーのすべてがオブジェクトであるため(ブロックを除く:))。しかし、それはこのようである必要はありません、それはただマッツの設計決定でした(私はそれがマッツだったと思います)。一部の言語では、これらは2つの完全に別個の交差しない階層です。オブジェクトとそのクラスを混在させないでください。甘いものと四角いものを混ぜるようなものです。
あなたの質問は、最小限の比較を行うように最適化されていません。比較する代わりに:
String.ancestors
String.class.ancestors
比較する必要があります:
String
String.class
そして、これらは以下と同等です:
String
Class
StringのインスタンスであるためですClass。とは異なるので、同じである必要はありませStringん。Classancestors