判定 - ruby 数値型




ルビーでオブジェクトの型を決定する (3)

Rubyでは、しばしば、オブジェクトのクラスが実際に何かを気にする必要はありません。それは、それが特定のメソッドに応答することだけです。 これはDuck Typingと呼ばれ、あらゆる種類のRubyコードベースで表示されます。

だから多くの場合(ほとんどではないが)、 #respond_to?(method)を使ってDuck Typingを使うのが#respond_to?(method)

object.respond_to?(:to_i)

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

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

私はルビーで私ができることを知っている:

1.9.3p194 :002 > 1.class
 => Fixnum 

しかし、これはオブジェクトのタイプを決定する適切な方法ですか?


Rubyの世界で不安定な用語である、オブジェクトの "タイプ"を判断する適切な方法は、 object.classを呼び出すことobject.class

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

通常、型チェックはRubyでは行われませんが、オブジェクトは「 Duck型指定 」と呼ばれる特定のメソッドに応答する能力に基づいて評価されます 。 言い換えれば、それがあなたが望む方法に反応すれば、そのタイプについて特別な理由はありません。

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


私は「はい」と言います。 "Matz"がこのような話をしていたので、 "Rubyオブジェクトには型がありません。" そのすべてではなく、彼が私たちに手を差し伸べようとしている部分です。 誰が "Everything is Object"と言ったのですか? 追加するには、 "データにはオブジェクトがありません"と述べました。

だから我々はこれを楽しむかもしれない。

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

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

12345.class

'my string'.class

彼らはまた祖先を持つかもしれない

Object.ancestors

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

クラスを知ったら、どのメソッドを使用するかを調べることができます。 それが「データ型」が必要な場所です。 あなたが実際に詳細を参照したい場合は...

"Rubyオブジェクトモデル"

これはRubyがオブジェクトをどのように扱うかという用語です。 これは内部的なものなので、実際にはそれほど多くは見えませんが、知っているといいです。 しかしそれは別の話題です。

はい! クラスはデータ型です。 オブジェクトにはクラスがあり、データには型があります。 ですから、データベースについて知っていれば、有限のタイプのセットしかないことがわかります。

テキストブロック番号





types