私はJRubyで遊んだところです。これは私の最初のRuby=投稿です。Rubyのクラスとオブジェクトを理解するのに苦労しました。他のオブジェクト指向言語のクラスとオブジェクトのように意味するわけではありません。例としては
Class.is_a? Object
trueを返し、
Object.is_a? Object
too。
したがって、クラスとオブジェクトは両方ともオブジェクトです
ここに別のものがあります
Class.is_a? Class
trueを返し、
Object.is_a? Class
too。
待って、まだ終わってない
Object.instance_of? Class
Class.instance_of? Class
どちらも正しい
Object.instance_of? Object
Class.instance_of? Object
どちらも誤りです。右、何もオブジェクトのインスタンスになることはできません。
そして
Class.kind_of? Class
Object.kind_of? Class
どちらも本当です
Class.kind_of? Object
Object.kind_of? Object
どちらも本当です
したがって、両方がまったく同じであるのに、なぜこれらの両方があるのでしょうか?
もう少し掘り下げた後、両方でサポートされているメソッドリストを返すこの簡単なメソッドを書きました
irb(main):054:0> def print_methods(obj)
irb(main):055:1> obj.methods.each do |mm|
irb(main):056:2* puts mm
irb(main):057:2> end
irb(main):058:1> end
Print_methods(Object)とprint_methods(Class)のメソッドの違いのみが
Nesting
ネストが継承を意味する場合、オブジェクトはシールクラスに似ていますか?
誰かが私にこれが何であるかを明確にできますか?
pdate: Eddsコメントへ
興味深いことに、メソッドリストには多くの違いがあります。
c=Class.new
print_methods(c)
&
o=Object.new
print_methods(o)
これで、クラスのインスタンスは実際にはクラスインスタンスであることがわかります(このクラスインスタンスは実際にはオブジェクトです)。オブジェクトインスタンスではありません。このインスタンスでさえ、別のインスタンスにまたがることができます
xx = c.new //works - c is an Object / and xx is a instance of an Object c
yy = o.new //nope - o is already a instance of an Object, so it cannot be instantiated again
最後に、Objectは実際にはクラスのインスタンスです。なぜなら
xx.is_a? Class
は偽ですが、
xx.is_a? Object
trueを返します
私は正しいですか?
基本的に理解すべき重要なことは、すべてのクラスがClass
クラスのインスタンスであり、すべてのクラスがObject
のサブクラスであることです(1.8では1.9では、すべてのクラスはBasicObject
のサブクラスです)。つまり、すべてのクラスは、Object
のサブクラスのインスタンスであるという意味でオブジェクトです。つまり、Class
です。
もちろん、これはClass
がそれ自体のインスタンスであることを意味します。それがあなたの脳を傷つけるなら、それについてあまり深く考えないでください。
Object
およびClass
はis_a? Object
ですx.is_a? y
は、x.class == y or x.class < y
の場合、つまりtrue
のクラスがx
である場合、またはy
のクラスがx
を継承している場合、y
を返します。すべてのクラスはオブジェクトから継承するため、x.is_a? Object
はx
が何であってもtrueを返します。 (とにかく1.8では、1.9では、継承階層の最も基本的なクラスであるBasicObject
もあります)。
is_a? Class
ですObject
とClass
はどちらも確かにクラスなので、驚くべきことではありません。
instance_of? Class
ですが、instance_of? Object
ではありません。is_a?
とは異なり、x.instance_of? y
は、x.class == y
がy
のサブクラスである場合ではなく、x.class
の場合にのみtrueを返します。したがって、x
とy
はどちらもinstance_of? Class
であるため、instance_of? Object
ではありません。
右、何もオブジェクトのインスタンスになることはできません。
それは真実ではない。 Object.new.instance_of? Object
はtrueです。
kind_of?
はis_a?
のエイリアスなので、上記を参照してください。
したがって、両方がまったく同じであるのに、なぜこれらの両方があるのでしょうか?
これまでのすべてがすべてのクラスに当てはまることを指摘しておく必要があります。例えば。上記と同じ理由で、String.is_a? Object
、String.is_a? Class
、String.instance_of? Class
はtrue、String.instance_of? Object
はfalseです。 (String.is_a? String
とString.instance_of? String
も同じ理由で両方ともfalseです-文字列は文字列ではなくクラスです)。
これから、すべてのクラスが同じであると結論付けることはできません。それらは同じクラスのすべてのインスタンスです。
Object
とClass
はどちらもクラスなので、どちらもClass
で定義されたすべてのインスタンスメソッドを持っています。 Class
には、シングルトンメソッドnesting
が追加されています。 nesting
は、現在ネストされているモジュールを示します。継承とは関係ありません。
特定のクラスについて、TheClass.methods
は、Class
によって定義されたインスタンスメソッドを返します(たとえば、superclass
が継承するクラスを返すTheClass
、およびnew
の新しいインスタンスを作成するTheClass
)と、そのクラスによって定義されたシングルトンメソッド。
とにかく、methods
は、特定のオブジェクトで直接呼び出すことができるメソッドを通知するだけです。クラスのインスタンスで呼び出すことができるメソッドはわかりません。そのためには、instance_methods
を使用できます。これは、Object
とClass
で大きく異なる結果を返します。
Rubyでは、クラスとモジュールを含むすべてがObject
です。 Object
は最も低レベルのクラスです(まあ、Ruby 1.9.2にはBasicObject
もありますが、これは別の話です)。
次の出力を参照してください。
> Object.ancestors
# => [Object, Kernel, BasicObject]
> Class.ancestors
# => [Class, Module, Object, Kernel, BasicObject]
> Module.ancestors
# => [Module, Object, Kernel, BasicObject]
> String.ancestors
# => [String, Comparable, Object, Kernel, BasicObject]
ご覧のとおり、Class
とModule
はどちらもObject
を継承しています。
元のアサーションに戻ると、違いを理解する必要があります
is_a?
kind_of'
instance_of?
互換性はありません。 is_a?
およびkind_of?
は、otherが同じクラスまたは祖先である場合にtrueを返します。逆に、instance_of?
は、otherが同じクラスである場合にのみtrueを返します。
> Class.is_a? Object
# => true
> Class.kind_of? Object
# => true
> Class.instance_of? Object
# => false
クラス/メタクラスの階層は常に少し不可解です:)比較のためだけに Smalltalkの1つです ; Rubyでは、セットアップは同じ原則に基づいていますが、Behavior
とClassDescription
の区別がなく、考慮すべきモジュールと固有クラスがあります。
Smalltalkオブジェクトモデルの完全な説明は Pharo by Example にあり、これは 関連する質問 で指摘されています。
Ruby everythingのRameshはオブジェクトであり、Classも例外ではありません。
iRBでこれを試してください
Ruby-1.9.2-p136 :001 > o = Object.new
=> #<Object:0x000001020114b0>
Ruby-1.9.2-p136 :002 > o.is_a? Class
=> false
Ruby-1.9.2-p136 :003 > o.is_a? Object
=> true
この例では、オブジェクトのインスタンスを作成し、それがクラス(false)かオブジェクト(true)かを確認しました。
Rubyのクラスは、そのクラスのインスタンスを作成するために使用されるある種のテンプレートオブジェクトです。これは明確ではありません。重要な概念は、RubyはJavaではなく純粋なオブジェクト指向言語であるということです。
答えの1つはこれについて言及しています:
基本的に理解すべき重要なことは、すべてのクラスはClassクラスのインスタンスであり、すべてのクラスはObjectのサブクラスであることです。したがって、すべてのクラスは、オブジェクトのサブクラス、つまりクラスのインスタンスであるという意味でオブジェクトです。
ちょっと頭がおかしい人には違う言葉で言いたいだけです。最初に自問してください。プログラミングのインスタンスは何ですか?プログラミングのサブクラスとは何ですか?インスタンスは、青写真(クラス)の単なる実現バリエーションです。サブクラスは、別のクラス(ブループリント)を継承するクラス(ブループリント)です。したがって、新しいクラスを作成すると、次のようになります。
class Apple
end
アップルはクラスのインスタンスです。つまり、ブループリントの実現されたバリエーションです。設計図を受け取り、詳細(メソッドと変数)を独自のバリエーションで埋めます。まあ、ブループリントは別のブループリントであるObjectを継承しています。したがって、すべてのクラスはObjectのサブクラスであるClassのインスタンスです。
class A
end
A.parent
=> Object
A.class
=> Class
注クラスの継承チェーンにはモジュールがあります(クラスの親がオブジェクトであるため、モジュールはミックスインとしてクラスに含まれていますか?)。
A.is_a?(Module)
=> true
クラスAのインスタンス(A.new)には、Aの独自のバリエーションが実装されます。ただし、これらはオブジェクトインスタンスです。したがって、クラスインスタンス(例:クラスAの終了)とオブジェクトインスタンス(a = A.new)を区別する必要があります。オブジェクトインスタンスには、異なる継承チェーンがあります。これらは、クラスクラスのバリエーションではなく、クラスインスタンスブループリントの実現バリエーションです。
つまり、継承チェーンではクラスまたはモジュールではありません。しかし、他のオブジェクトインスタンスなので、Aにオブジェクトインスタンスがあり、Bにオブジェクトインスタンスがあり、AがBから継承する場合、Aの新しいオブジェクトインスタンスをインスタンス化すると、このインスタンスの継承チェーンにBインスタンスが含まれます。
RubyのすべてがObjectから継承されるため、これらはObjectからも継承されます。
a = A.new
=> #<A:0x007f966449b8d8>
a.is_a?(Class)
=> false
a.is_a?(Module)
=> false
a.is_a?(Object)
=> true
そして、これがすべてについて考える最良の方法です。考えを深めすぎないでください。これを私が書いたとおりに受け入れます。