オブジェクトのクラスを動的に判定するには (instanceof)

あるインスタンスが特定のクラスのインスタンスかどうかを判定する方法。

Java

instanceof という演算子を使う。(長いけどメソッドとかではなくて演算子だ)

Object obj = ...;
if (obj instanceof Integer) {
    ...;
}

instanceof はインターフェースに対しても使える。

Scala

Javaで instanceof キーワードに相当することをするには、isInstanceOf という Any クラスのメソッドを呼び出す。

val obj = ...;
if (obj.isInstanceOf[Int]) {
    ...;
}

JVM的に本当に isInstanceOf というメソッドがあるのではなく、 Javaのinstanceofキーワードと同じようにコンパイルされるのだと思う、たぶん。

ただ、isInstanceOfメソッドを使うのではなく、match式を使うほうがScalaらしい。

PHP

instanceof という演算子を使う。

if ($obj instanceof MyClass) {
    ...;
}

instanceof はインターフェースに対しても使える。

配列かどうかを判定するには is_array という関数を使う。

if (is_array($obj)) {
    ...;
}

整数型かどうかを判定するには is_int という関数を使う。

$x = "1";
var_export(is_int($x)); // => false

$x = 1;
var_export(is_int($x)); // => true

同様の関数

is_bool
論理型かどうか
is_int
整数型かどうか
is_float
浮動小数点数型かどうか
is_string
文字列型かどうか
is_array
配列かどうか

Python

isinstance という関数でクラスを判定できる。

print(isinstance(100, int))    # True
print(isinstance(3.14, int))   # False
print(isinstance(100, float))  # False
print(isinstance(3.14, float)) # True

print(isinstance(False, bool)) # True
print(isinstance(True, bool))  # True
print(isinstance(False, int))  # True
print(isinstance(True, int))   # True

print(isinstance("foo", str))  # True

Ruby

is_a? メソッドを使うとクラスを判定できる。

num.is_a?(Integer) # 整数かどうか
str.is_a?(String)  # 文字列かどうか
arr.is_a?(Array)   # 配列かどうか
hash.is_a?(Hash)   # ハッシュかどうか

x = 1
p x.is_a?(Integer) # => true
p x.is_a?(Float)   # => false

x = 1.0
p x.is_a?(Integer) # => false
p x.is_a?(Float)   # => true

Perl

スカラ/配列/ハッシュの区別は、変数名の先頭の1文字(sigil)で区別されるので、プログラムの中で動的に判定が必要となるケースはない。

スカラが、なんらかの値なのか、レファレンスなのかの区別や、レファレンスであれば指す先の種類は、ref という関数(?)で判定できる。レファレンスでない場合は '' を返し、レファレンスの場合はその指す先のオブジェクトの種類を文字列で返す。

my $num = 1;
my $str = "abc";
my @arr = (1, 2, 3);
my %hash = (a => 1, b => 2);
sub func {
    ...;
}

print (ref $num eq ''); # => 1
print (ref $str eq ''); # => 1
print (ref @arr eq ''); # => 1
print (ref %hash eq ''); # => 1
print (ref &func eq ''); # => 1

my $ref_arr = [1, 2, 3];
my $ref_hash = {a => 1, b => 2};
my $ref_func = sub { print "Hello\n"; };

print (ref $ref_arr); # => ARRAY
print (ref $ref_hash); # => HASH
print (ref $ref_func); # => CODE

JavaScript

プリミティブ型を判定するには typeof という演算子を使う。結果を文字列で得られる。

var i = 100;
var f = 3.14;
var b = true;
var s = "foo";
var a = [10, 20, 30];

console.log(typeof i);         // => number
console.log(typeof f);         // => number
console.log(typeof b);         // => boolean
console.log(typeof s);         // => string
console.log(typeof a);         // => object
console.log(typeof null);      // => object
console.log(typeof undefined); // => undefined

オブジェクトのクラスを判定するには instanceof という演算子を使う。

console.log(s         instanceof Array); // => false
console.log(a         instanceof Array); // => true
console.log(null      instanceof Array); // => false
console.log(undefined instanceof Array); // => false
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。