173

ダート仕様は次のように述べています。

洗練された型情報は、実行時のオブジェクトの型を反映し、動的な型チェック構造(他の言語のinstanceOf、casts、typecaseなどの類似物)によって常に照会される場合があります。

素晴らしいように聞こえますが、同様のinstanceof演算子はありません。では、Dartでランタイムタイプチェックをどのように実行するのでしょうか?それは可能ですか?

4

9 に答える 9

240

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!");
  }
}
于 2011-10-10T16:51:42.297 に答える
64

DartObject型にはruntimeTypeインスタンス メンバーがあります (ソースはdart-sdkv1.14 のものです。以前に利用可能だったかどうかは不明です)

class Object {
  //...
  external Type get runtimeType;
}

使用法:

Object o = 'foo';
assert(o.runtimeType == String);
于 2016-03-11T21:31:11.600 に答える
20

他の人が述べたように、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.");
}
于 2012-08-30T14:01:56.300 に答える
16

型テストには 2 つの演算子がありE is Tます。E が型 T のインスタンスであることをE is! Tテストし、Eが型 T のインスタンスではないことをテストします。

E is Objectは常に true であり、 でnull is Tない限り常に falseであることに注意してくださいT===Object

于 2011-10-11T08:56:59.827 に答える
9

電話するだけ

print(unknownDataType.runtimeType)

データ上。

于 2020-11-08T13:07:46.353 に答える