これらは同じであるべきではありませんか?
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
同じですf
f.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
ん。Class
ancestors