Specyfikacja rzutek stwierdza:
Reifikowane informacje o typach odzwierciedlają typy obiektów w czasie wykonywania i mogą być zawsze sprawdzane przez dynamiczne konstrukcje sprawdzające typ (analogi instanceOf, rzutowania, typecase itp. W innych językach).
Brzmi świetnie, ale nie ma takiego instanceof
operatora. Jak więc sprawdzać typ w czasie wykonywania w Dart? Czy to w ogóle możliwe?
dynamic
dart
instanceof
dart-mirrors
Idolon
źródło
źródło
is
w specyfikacji nie ma żadnej wzmianki o operatorze. Lepiej odnieść się do pliku gramatyki w źródłach Dart: code.google.com/p/dart/source/browse/trunk/dart/language/ ...is
operator jest zdefiniowany na stronie 59 specyfikacji, sekcja 10.30 `` Test typu ''is
iis!
można je znaleźć w sekcji Operatorzy podczas wycieczki językowej Dart.getTypeName(dynamic obj) => obj.runtimeType;
!=
aleis!
... dezorientuje mnie, ale nieObject
Typ darta ma elementruntimeType
instancji (źródło pochodzi z wersjidart-sdk
1.14, nie wiem, czy było dostępne wcześniej)class Object { //... external Type get runtimeType; }
Stosowanie:
Object o = 'foo'; assert(o.runtimeType == String);
źródło
runtimeType
zajęcia mogą zostać zastąpione przez zajęcia, chociaż nie mogę wymyślić powodu, dla którego by to zrobili. (kod zewnętrzny nie może ustawić wartości, ponieważ jest to getter) Osobiście trzymałbym sięis
i zastanawiał.runtimeType
ma te ograniczenia.runtimeType
powinien być używany tylko do celów debugowania? Pytam, ponieważ nie ma żadnej wzmianki o tym w dokumentach dla Object lub gdzie indziej (które mogłem znaleźć).object.runtimeType
zwraca typ obiektuNa przykład:
print("HELLO".runtimeType); //prints String var x=0.0; print(x.runtimeType); //prints double
źródło
Jak wspominali inni,
is
operator Darta jest odpowiednikieminstanceof
operatora Javascript . Jednak nie znalazłem bezpośredniego odpowiednikatypeof
operatora w Dart.Na szczęście interfejs API dart: mirrors reflection został niedawno dodany do SDK i jest teraz dostępny do pobrania w najnowszym pakiecie Editor + SDK . Oto krótkie 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."); }
źródło
Unsupported operation: dart:mirrors is no longer supported for web apps
Istnieją dwa operatory do testowania typu:
E is T
testy dla E instancji typu T, podczas gdyE is! T
testy dla E, a nie instancji typu T.Zauważ, że
E is Object
jest to zawsze prawda inull is T
zawsze jest fałszem, chyba żeT===Object
.źródło
T===Object
? Dart nie ma operatora potrójnego równa się, ale zdecydowałeś się go użyć zamiast podwójnego równa się, więc zakładam, że różnica ma znaczenie.null is Object
byłoby prawdziwe, alenull is T
fałszywe dla każdego innego typu T. tbh, chociaż nie byłem w pobliżu Dart od wielu lat, więc nie mogę być pewien.Żeby nieco wyjaśnić różnicę między
is
iruntimeType
. Jak ktoś już powiedział (a to zostało przetestowane z Dart V2 +) następujący kod:class Foo { Type get runtimeType => String; } main() { var foo = new Foo(); if (foo is Foo) { print("it's a foo!"); } print("type is ${foo.runtimeType}"); }
wyświetli:
it's a foo! type is String
Co jest złe. Teraz nie widzę powodu, dla którego należałoby to zrobić ...
źródło
Po prostu zadzwoń
na danych.
źródło