1

これらは同じであるべきではありませんか?

p String.ancestors
p String.class.ancestors

代わりに私は得る:

[String, Comparable, Object, Kernel, BasicObject]
[Class, Module, Object, Kernel, BasicObject]

ご協力いただきありがとうございます。

4

2 に答える 2

7

TL; DR

これらは同じではありませんか?

いいえ、すべきではありません、なぜですか?

完全な答え

との違いはとの違いFooFoo.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つの完全に別個の交差しない階層です。オブジェクトとそのクラスを混在させないでください。甘いものと四角いものを混ぜるようなものです。

于 2013-03-19T05:31:37.290 に答える
1

あなたの質問は、最小限の比較を行うように最適化されていません。比較する代わりに:

String.ancestors
String.class.ancestors

比較する必要があります:

String
String.class

そして、これらは以下と同等です:

String
Class

StringのインスタンスであるためですClass。とは異なるので、同じである必要はありませStringん。Classancestors

于 2013-03-19T08:23:20.287 に答える