2011-10-10 11 views
21

specyfikacji Dart stany:Jak wykonać sprawdzanie typu runtime w Dart?

reified informacja o typie odzwierciedla typy obiektów w czasie rzeczywistym i mogą być zawsze na zapytania dynamicznych konstrukcji typechecking (The analogi instanceof, odlewy, typecase itd. W innych językach).

Brzmi świetnie, ale nie ma operatora podobnego do instanceof. Jak więc wykonać sprawdzanie typu w czasie wykonywania w Dart? Czy to w ogóle możliwe?

Odpowiedz

22

Operator instanceof nazywa się is w Dart. Spec nie jest przyjazny dla zwykłego czytelnika, więc najlepszym obecnie opisem jest http://www.dartlang.org/articles/optional-types/.

Oto przykład:

class Foo { } 

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

Wygląda na to, że w specyfikacji nie ma wzmianki o operatorze 'is'. Lepiej odwołać się do pliku gramatycznego ze źródeł Dart: https://code.google.com/p/dart/source/browse/trunk/dart/language/grammar/Dart.g – Idolon

+3

@Idolon, operator 'is' jest zdefiniowany na stronie 59 specyfikacji, sekcja 10.30 "Test typu" – Duncan

6

Istnieją dwa operatory do badań typu: E is T testy dla E instancję typu T, a E is! T testy dla E nie instancję typu T.

Zauważ, że E is Object jest zawsze prawdziwe, a null is T jest zawsze fałszywe, chyba że T===Object.

12

Jak już wspomnieli niektórzy, operator Darta is jest odpowiednikiem operatora Javascript instanceof. Jednak nie znalazłem bezpośredniego odpowiednika operatora typeof w Dart.

Na szczęście model dart:mirrors reflection API został niedawno dodany do zestawu SDK i jest już dostępny do pobrania w wersji latest Editor+SDK package. 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."); 
} 
1

Dart Object typ ma człon runtimeType Instancji (źródłem jest od dart-sdk v1.14, nie wiem, czy to był dostępny wcześniej)

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

Zastosowanie:

Object o = 'foo'; 
assert(o.runtimeType == String); 
+0

RuntimeType służy wyłącznie do debugowania, a kod aplikacji nie powinien na nim polegać. Może być nadpisany przez klasy, aby zwrócić fałszywe wartości i prawdopodobnie zwraca nieużyteczne wartości po transpozycji do JS –

+0

Dzięki za uwagę, jestem całkiem nowy dla Dart i zgadzam się, że 'runtimeType' może być nadpisany przez klasy, chociaż mogę ' Zastanawiam się, dlaczego tak by się stało. (kod zewnętrzny nie może ustawić wartości sinse to getter) Osobiście trzymałbym się 'is' i refleksji. – sbedulin

+0

W porządku, jest to tutaj wspomniane. Nie jest oczywiste, że 'runtimeType' ma te ograniczenia. –