私が探しているものの例としてpythonを使用します(Pythonがわからない場合は、疑似コードと考えることができます)。
>>> a = 1
>>> type(a)
<type 'int'>
私はルビーで私ができることを知っています:
1.9.3p194 :002 > 1.class
=> Fixnum
しかし、これはオブジェクトのタイプを判別する適切な方法ですか?
私が探しているものの例としてpythonを使用します(Pythonがわからない場合は、疑似コードと考えることができます)。
>>> a = 1
>>> type(a)
<type 'int'>
私はルビーで私ができることを知っています:
1.9.3p194 :002 > 1.class
=> Fixnum
しかし、これはオブジェクトのタイプを判別する適切な方法ですか?
回答:
オブジェクトの「タイプ」を判別する適切な方法は、Rubyの世界では不安定な用語であり、を呼び出すことobject.class
です。
クラスは他のクラスから継承できるため、オブジェクトが「特定のタイプ」であるかどうかobject.is_a?(ClassName)
を確認したい場合object
は、がタイプであるClassName
か、それから派生したものであるかを確認するために呼び出すことができます。
通常、型のチェックはRubyでは行われませんが、オブジェクトは特定のメソッドに応答する能力に基づいて評価されます。これは、一般的に「ダックタイピング」と呼ばれます。つまり、必要なメソッドに応答する場合は、型にこだわる必要はありません。
たとえばobject.is_a?(String)
、別のクラスが文字列に変換するメソッドを実装したり、文字列の動作と同じように動作させたりする可能性があるため、厳格すぎます。object.respond_to?(:to_s)
問題のオブジェクトがあなたが望むことをすることをテストするより良い方法でしょう。
#class
んではない、それはその返し、オブジェクトの型を返すクラスを。名前は死んだプレゼントであるべきです。クラスとタイプは、OOの完全に異なる2つの概念です。
typeof
、C、JavaScriptなどから最も近いものはclass
です。Rubyには、他の言語のような正式なプロトコルシステムはありません。Objective-Cは、それに最も近いSmalltalkです。「タイプ」を「特定の一連のメソッドに応答して許容可能な結果を返すオブジェクト」として定義している場合、それを表明する方法は実際にはありません。緩すぎます。Rubyでオブジェクトのタイプを参照する場合、ほとんどの場合、クラスについて話していることがわかります。そのため、引用符で用語の種類を使用しました。
int i
Integer j
あなたも試すことができます: instance_of?
p 1.instance_of? Fixnum #=> True
p "1".instance_of? String #=> True
p [1,2].instance_of? Array #=> True
Rubyではしばしば、実際にはオブジェクトのクラスが何であるかを気にせず、特定のメソッドに応答することだけを気にします。これはダックタイピングと呼ばれ、あらゆる種類のRubyコードベースで確認できます。
したがって、多くの(ほとんどではないにしても)ケースでは、以下を使用してダックタイピングを使用するのが最善#respond_to?(method)
です。
object.respond_to?(:to_i)
「はい」と言います。"マッツ"が彼の講演の1つでこのようなことを言っていたように、 "Rubyオブジェクトには型がありません。" すべてではなく、彼が私たちに伝えようとしている部分です。では、なぜ誰もが「すべてがオブジェクトである」と言ったのでしょうか。さらに、「データにはオブジェクトではなくタイプがある」と述べた。
だからこれを楽しむかもしれません。
https://www.youtube.com/watch?v=1l3U1X3z0CE
しかし、Rubyはクラスだけではオブジェクトのタイプをあまり気にしません。型ではなくクラスを使用します。すべてのデータにはクラスがあります。
12345.class
'my string'.class
彼らには祖先もいる
Object.ancestors
それらにはメタクラスもありますが、その詳細を保存します。
クラスがわかったら、クラスに使用できるメソッドを検索できます。ここで「データ型」が必要になります。詳細を調べたい場合は、ルックアップ...
「Rubyオブジェクトモデル」
Rubyがオブジェクトを処理する方法に使用される用語です。これはすべて内部にあるため、実際にはあまり表示されませんが、知っておくと便利です。しかし、それは別のトピックです。
はい!クラスはデータ型です。オブジェクトにはクラスがあり、データにはタイプがあります。したがって、データベースについて知っていれば、有限の型のセットしかないことがわかります。
テキストブロック番号
Object.ancestors # => [Object, Kernel, BasicObject]
isinstance
応答を必要とするか、確認します。しかし、単に「NOES !!!」と言うだけです。本当に役に立ちませんか?代わりに、教育的であることを検討してください。