web-dev-qa-db-ja.com

Dartでランタイムタイプチェックを実行する方法

Dart仕様の状態:

修正された型情報は、実行時のオブジェクトの型を反映し、常に動的な型チェック構造(他の言語のinstanceOf、キャスト、型ケースなどに類似)によって照会されます。

すばらしいですが、instanceofのような演算子はありません。それでは、Dartでどのようにランタイムタイプチェックを実行しますか?まったく可能ですか?

57
Idolon

Instanceof-operatorは、Dartではisと呼ばれます。仕様はカジュアルな読者にとってはまったく友好的ではないため、現時点での最良の説明は http://www.dartlang.org/articles/optional-types/ のようです。

以下に例を示します。

class Foo { }

main() {
  var foo = new Foo();
  if (foo is Foo) {
    print("it's a foo!");
  }
}
77
Patrick

Dart ObjectタイプにはruntimeTypeインスタンスメンバーがあります(ソースはDart-sdk v1.14、それが以前に利用可能だったかどうかわからない)

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

使用法:

Object o = 'foo';
assert(o.runtimeType == String);
17
sbedulin

他の人が述べたように、Dartのis演算子はJavascriptの instanceof 演算子と同等です。ただし、Dartで typeof 演算子の直接の類似物は見つかりませんでした。

ありがたいことに Dart:mirrors reflection API が最近SDKに追加され、 最新のエディター+ 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.");
}
15
Rob

型テストには2つの演算子があります:E is TはT型のインスタンスをEに対してテストし、E is! TテストE notタイプTのインスタンス.

ご了承ください E is Objectは常に真であり、null is Tは、T===Object

9
Duncan

object.runtimeTypeはオブジェクトのタイプを返します

例:

print("HELLO".runtimeType); //prints String
var x=0.0;
print(x.runtimeType); //prints double
8
Raj Yadav

小さなパッケージは、いくつかの問題を解決するのに役立ちます。

_import 'Dart:async';

import 'package:type_helper/type_helper.Dart';

void main() {
  if (isTypeOf<B<int>, A<num>>()) {
    print('B<int> is type of A<num>');
  }

  if (!isTypeOf<B<int>, A<double>>()) {
    print('B<int> is not a type of A<double>');
  }

  if (isTypeOf<String, Comparable<String>>()) {
    print('String is type of Comparable<String>');
  }

  var b = B<Stream<int>>();
  b.doIt();
}

class A<T> {
  //
}

class B<T> extends A<T> {
  void doIt() {
    if (isTypeOf<T, Stream>()) {
      print('($T): T is type of Stream');
    }

    if (isTypeOf<T, Stream<int>>()) {
      print('($T): T is type of Stream<int>');
    }
  }
}
_

結果:

B<int> is type of A<num> B<int> is not a type of A<double> String is type of Comparable<String> (Stream<int>): T is type of Stream (Stream<int>): T is type of Stream<int>

0
mezoni