ダート仕様は次のように述べています。
洗練された型情報は、実行時のオブジェクトの型を反映し、動的な型チェック構造(他の言語のinstanceOf、casts、typecaseなどの類似物)によって常に照会される場合があります。
素晴らしいように聞こえますが、同様のinstanceof
演算子はありません。では、Dartでランタイムタイプチェックをどのように実行するのでしょうか?それは可能ですか?
ダート仕様は次のように述べています。
洗練された型情報は、実行時のオブジェクトの型を反映し、動的な型チェック構造(他の言語のinstanceOf、casts、typecaseなどの類似物)によって常に照会される場合があります。
素晴らしいように聞こえますが、同様のinstanceof
演算子はありません。では、Dartでランタイムタイプチェックをどのように実行するのでしょうか?それは可能ですか?
is
Dart ではinstanceof-operator が呼び出されます。この仕様は、カジュアルな読者にとっては必ずしも友好的ではないため、現時点での最良の説明はhttp://www.dartlang.org/articles/optional-types/のようです。
次に例を示します。
class Foo { }
main() {
var foo = new Foo();
if (foo is Foo) {
print("it's a foo!");
}
}
DartObject
型にはruntimeType
インスタンス メンバーがあります (ソースはdart-sdk
v1.14 のものです。以前に利用可能だったかどうかは不明です)
class Object {
//...
external Type get runtimeType;
}
使用法:
Object o = 'foo';
assert(o.runtimeType == String);
他の人が述べたように、Dart のis
オペレーターは Javascript のinstanceof
オペレーターと同等です。typeof
ただし、 Dart で演算子の直接の類似物は見つかりませんでした。
ありがたいことに、最近dart:mirrors リフレクション APIが SDK に追加され、最新の Editor+SDK パッケージでダウンロードできるようになりました。ここに短いデモがあります:
import 'dart:mirrors';
getTypeName(dynamic obj) {
return reflect(obj).type.reflectedType.toString();
}
void main() {
var val = "\"Dart is dynamically typed (with optional type annotations.)\"";
if (val is String) {
print("The value is a String, but I needed "
"to check with an explicit condition.");
}
var typeName = getTypeName(val);
print("\nThe mirrored type of the value is $typeName.");
}
型テストには 2 つの演算子がありE is T
ます。E が型 T のインスタンスであることをE is! T
テストし、Eが型 T のインスタンスではないことをテストします。
E is Object
は常に true であり、 でnull is T
ない限り常に falseであることに注意してくださいT===Object
。
電話するだけ
print(unknownDataType.runtimeType)
データ上。