web-dev-qa-db-ja.com

ルビの中のオブジェクトの型を決定する

私が探しているものの例として、私はPythonを使用します(あなたがPythonを知らないなら、あなたはそれを疑似コードとして考えることができます):

>>> a = 1
>>> type(a)
<type 'int'>

私はRubyで私ができることを知っています:

1.9.3p194 :002 > 1.class
 => Fixnum 

しかし、これはオブジェクトのタイプを判断するための正しい方法ですか?

301
Zippy Zeppoli

Rubyの世界ではぐらついている用語であるオブジェクトの「タイプ」を決定するための適切な方法はobject.classを呼び出すことです。

クラスは他のクラスから継承できるため、オブジェクトが「特定の型」であるかどうかを判断したい場合は、object.is_a?(ClassName)を呼び出して、objectClassName型であるか派生しているかを確認できます。

通常型チェックはRubyでは行われませんが、代わりにオブジェクトは特定のメソッドに応答する能力に基づいて評価されます。一般に " ダックタイピング "と呼ばれます。言い換えれば、それがあなたが望むメソッドに応答するのであれば、そのタイプにこだわる理由はありません。

たとえば、object.is_a?(String)は、他のクラスがそれを文字列に変換するメソッドを実装したり、Stringの動作と同じように動作させたりする可能性があるため、硬すぎます。 object.respond_to?(:to_s)は、問題のオブジェクトがあなたが望むことをしていることをテストするためのより良い方法です。

502
tadman

あなたも試すことができます: instance_of?

p 1.instance_of? Fixnum    #=> True
p "1".instance_of? String  #=> True
p [1,2].instance_of? Array #=> True
67
Arup Rakshit

多くの場合、Rubyでは、実際にはオブジェクトのクラスが何であるかを気にする必要はなく、それが特定のメソッドに応答することを気にするだけです。これは Duck Typing として知られており、あらゆる種類のRubyコードベースで見られます。

したがって、(ほとんどではないにしても)多くの場合、 #respond_to?(method) を使用してDuck Typingを使用するのが最善です。

object.respond_to?(:to_i)
37
Stuart M

私は「はい」と言うでしょう。 「Matz」が彼の講演の中でこのようなことを言っていたように、「Rubyオブジェクトには型がない」。それのすべてではなく、彼が私達に伝えようとしている部分です。なぜ誰もが「すべてはオブジェクトだ」と言ったのでしょうか?さらに彼は「データにはオブジェクトではなく型がある」と述べた。

だから私たちはこれを楽しむかもしれません。

https://www.youtube.com/watch?v=1l3U1X3z0CE

しかし、Rubyはクラスだけでオブジェクトの種類についてはあまり気にしません。型ではなくクラスを使用します。すべてのデータはクラスを持ちます。

12345.class

'my string'.class

彼らはまた祖先を持っているかもしれません

Object.ancestors

彼らはまたメタクラスを持っていますが、私はあなたにそれに関する詳細を保存します。

クラスがわかれば、そのクラスに使用できるメソッドを調べることができます。それが「データ型」が必要なところです。あなたが本当に詳細に入りたいならば、調べてください...

「Rubyオブジェクトモデル」

これは、Rubyがオブジェクトを処理する方法に使用される用語です。これはすべて内部的なものなので、実際にはあまり目にすることはありませんが、知っておくといいです。しかしそれは別の話題です。

はい!クラスはデータ型です。オブジェクトはクラスを持ち、データは型を持ちます。データベースについて知っているのであれば、有限の種類の型しかないことがわかります。

テキストブロック番号

12