ダート仕様は次のように述べています。
洗練された型情報は、実行時のオブジェクトの型を反映し、動的な型チェック構造(他の言語のinstanceOf、casts、typecaseなどの類似物)によって常に照会される場合があります。
素晴らしいように聞こえますが、同様のinstanceof演算子はありません。では、Dartでランタイムタイプチェックをどのように実行するのでしょうか?それは可能ですか?
ダート仕様は次のように述べています。
洗練された型情報は、実行時のオブジェクトの型を反映し、動的な型チェック構造(他の言語のinstanceOf、casts、typecaseなどの類似物)によって常に照会される場合があります。
素晴らしいように聞こえますが、同様のinstanceof演算子はありません。では、Dartでランタイムタイプチェックをどのように実行するのでしょうか?それは可能ですか?
isDart では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-sdkv1.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)
データ上。