it-swarm.com.de

Wie führe ich eine Laufzeitüberprüfung in Dart durch?

Dart-Spezifikation lautet:

Reified-Typinformationen spiegeln die Objekttypen zur Laufzeit wider und können immer durch dynamische Typenkonstrukte (die Analoga von instanceOf, casts, typecase usw. in anderen Sprachen) abgefragt werden.

Hört sich gut an, aber es gibt keinen instanceofname __- ähnlichen Operator. Wie führen wir in Dart eine Laufzeit-Typprüfung durch? Ist das überhaupt möglich?

34
Idolon

Die Instanz des Operators heißt in Dart is. Die Spezifikation ist für einen gelegentlichen Leser nicht gerade freundlich, daher scheint die beste Beschreibung im Moment zu sein: http://www.dartlang.org/articles/optional-types/ .

Hier ist ein Beispiel:

class Foo { }

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

Wie andere bereits erwähnt haben, ist der Operator is von Dart gleichbedeutend mit dem Operator instanceof von Javascript. Ich habe jedoch kein direktes Analogon des Operators typeof in Dart gefunden.

Zum Glück wurde die Dart: Spiegelreflexions-API kürzlich zum SDK hinzugefügt und steht jetzt im neuesten Editor + SDK-Paket zum Download zur Verfügung. Hier ist eine kurze Demo:

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

Es gibt zwei Operatoren für die Typprüfung: E is T testet für E eine Instanz vom Typ T, während E is! T für E nicht eine Instanz vom Typ T prüft.

Beachten Sie, dass E is Object immer true ist und null is T immer false ist, es sei denn T===Object.

7
Duncan

Dart Object type hat ein runtimeType-Instanzmitglied (Quelle ist von Dart-sdk v1.14, weiß nicht, ob es früher verfügbar war)

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

Verwendungszweck:

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

object.runtimeType gibt den Objekttyp zurück

Zum Beispiel:

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

Ein kleines Paket kann helfen, einige Probleme zu lösen.

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>');
    }
  }
}

Ergebnis:

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