Как выполнить тип выполнения, регистрируясь в Dart?

Состояния спецификации Dart:

Овеществленная информация о типе отражает типы объектов во времени выполнения и может всегда запрашиваться динамическими конструкциями typechecking (аналоги instanceOf, бросков, typecase и т.д. на других языках).

Звучит великолепно, но существует нет instanceof- как оператор. Таким образом, как мы выполняем регистрирующийся в типе выполнения Dart? Действительно ли это возможно вообще?

62
задан 18 February 2014 в 15:49

4 ответа

Тип Dart Object имеет runtimeType член экземпляра (источник от dart-sdk v1.14, не знайте, было ли это доступно ранее)

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

Использование:

Object o = 'foo';
assert(o.runtimeType == String);
20
ответ дан 31 October 2019 в 13:36

object.runtimeType возвраты тип объекта

, Например:

print("HELLO".runtimeType); //prints String
var x=0.0;
print(x.runtimeType); //prints double
9
ответ дан 31 October 2019 в 13:36

Небольшой пакет может помочь решить некоторые проблемы.

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
ответ дан 31 October 2019 в 13:36

Как другие упомянули, Dart is, оператор является эквивалентом JavaScript instanceof оператор. Однако я не нашел прямой аналог typeof оператор в Dart.

К счастью dart:mirrors API Reflection был недавно добавлен к 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.");
}
16
ответ дан 31 October 2019 в 13:36

Другие вопросы по тегам:

Похожие вопросы: