今回はpythonを例にしてご紹介します(pythonを知らない方は擬似コードと考えていただいても構いません)。
>>> a = 1
>>> type(a)
<type 'int'>
私はrubyで:
1.9.3p194 :002 > 1.class
=> Fixnum
しかし、これはオブジェクトのタイプを決定する適切な方法ですか?
オブジェクトのタイプを決定する適切な方法は、object.class
を呼び出すことです。
クラスは他のクラスを継承することができるので、あるオブジェクトが "of a particular type"であるかどうかを判断したい場合には、object.is_a?(ClassName)
を呼び出して、object
が ClassName
型であるか、またはそこから派生したものであるかを確認することができます。
通常、Rubyでは型のチェックは行われず、代わりにオブジェクトは特定のメソッドに反応する能力に基づいて評価されます。一般的には "Duck typing" と呼ばれます。つまり、欲しいメソッドに反応するのであれば、型にこだわる必要はありません。
例えば、object.is_a?(String)
は、他のクラスがそれを文字列に変換するメソッドを実装したり、Stringの動作と同じ動作をさせるかもしれないので、厳格すぎます。object.respond_to?(:to_s)`は、問題のオブジェクトがあなたが望むことをするかどうかをテストするためのより良い方法でしょう。
を試してみるのもいいでしょう。instance_of?
p 1.instance_of? Fixnum #=> True
p "1".instance_of? String #=> True
p [1,2].instance_of? Array #=> True
Rubyでは、オブジェクトのクラスを気にせず、特定のメソッドに反応するかどうかだけを気にすることがよくあります。これはDuck Typingとして知られており、あらゆる種類のRubyコードベースで目にすることができます。
ですから、多くの場合(ほとんどではないにしても)、#respond_to?(method)
を使ってダック・タイピングを使うのがベストです。
object.respond_to?(:to_i)