Dartspezifikation besagt:
Reifizierte Typinformationen spiegeln die Objekttypen zur Laufzeit wider und können immer von dynamischen Typprüfungskonstrukten abgefragt werden (die Analoga von instanceOf, casts, typecase usw. in anderen Sprachen).
Hört sich toll an, aber es gibt keinen instanceof
ähnlichen Operator. Wie führen wir eine Laufzeit-Typprüfung in Dart durch? Ist das überhaupt möglich?
dynamic
dart
instanceof
dart-mirrors
Idolon
quelle
quelle
is
Bediener in der Spezifikation überhaupt nicht erwähnt . Es ist besser, auf die Grammatikdatei in Dart-Quellen zu verweisenis
Operator ist auf Seite 59 der Spezifikation, Abschnitt 10.30 ' Typprüfung 'is
undis!
finden Sie im Abschnitt Operatoren der Dart-Sprachtour.getTypeName(dynamic obj) => obj.runtimeType;
!=
aberis!
... verwirrt mich nichtDer Dart-
Object
Typ hat einruntimeType
Instanzmitglied (Quelle stammt ausdart-sdk
Version 1.14, weiß nicht, ob es früher verfügbar war)Verwendung:
quelle
runtimeType
dies von Klassen überschrieben werden kann, obwohl ich mir keinen Grund vorstellen kann, warum sie es tun würden. (Externer Code kann den Wert nicht festlegen, da es sich um einen Getter handelt.) Persönlich würde ich mich an eineis
Reflexion halten.runtimeType
diese Einschränkungen bestehen.runtimeType
nur zum Debuggen verwendet werden? Ich frage, weil dies in den Dokumenten für Object oder anderswo (die ich finden konnte) nicht erwähnt wird.object.runtimeType
Gibt den Objekttyp zurückBeispielsweise:
quelle
Wie andere bereits erwähnt haben,
is
entspricht derinstanceof
Operator von Dart dem Operator von Javascript . Ich habe jedoch kein direktes Analogon destypeof
Operators in Dart gefunden.Zum Glück wurde die Dart: Mirrors Reflection 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:
quelle
Unsupported operation: dart:mirrors is no longer supported for web apps
Es gibt zwei Operatoren für die Typprüfung:
E is T
Tests für E, eine Instanz vom Typ T, währendE is! T
Tests für E keine Instanz vom Typ T sind.Beachten Sie, dass dies
E is Object
immer wahr undnull is T
immer falsch ist, es sei dennT===Object
.quelle
T===Object
? Dart hat den Operator Triple Equals nicht, aber Sie haben ihn anstelle von Double Equals verwendet. Ich gehe also davon aus, dass der Unterschied von Bedeutung ist.null is Object
wäre wahr, abernull is T
falsch für jeden anderen Typ T. tbh, obwohl ich seit vielen Jahren nicht mehr in der Nähe von Dart war, kann also nicht sicher sein.Nur um den Unterschied zwischen
is
und ein wenig zu verdeutlichenruntimeType
. Wie schon jemand sagte (und dies wurde mit Dart V2 + getestet) den folgenden Code:wird ausgegeben:
Was falsch ist. Jetzt kann ich den Grund nicht erkennen, warum man so etwas tun sollte ...
quelle