2011-10-10 16 views
21

specifica Dart stati:Come eseguire il controllo del tipo di runtime in Dart?

informazioni di tipo reificato riflette i tipi di oggetti in fase di esecuzione e può sempre essere interrogato dai costrutti typechecking dinamiche (i analoghi di instanceof, getta, ecc Typecase in altre lingue).

Suona bene, ma non c'è l'operatore instanceof-like. Quindi, come eseguiamo il controllo del tipo di runtime in Dart? È possibile a tutti?

risposta

22

L'operatore dell'istanza viene chiamato is in Dart. Le specifiche non sono esattamente amichevoli per un lettore casuale, quindi la descrizione migliore ora sembra essere http://www.dartlang.org/articles/optional-types/.

Ecco un esempio:

class Foo { } 

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

Sembra che non ci sia alcun riferimento all'operatore 'is' nelle specifiche. È meglio consultare il file di grammatica nei sorgenti di Dart: https://code.google.com/p/dart/source/browse/trunk/dart/language/grammar/Dart.g – Idolon

+3

@Idolon, l'operatore 'is' è definito a pagina 59 della specifica, sezione 10.30 'Tipo test' – Duncan

6

Ci sono due operatori per prove di tipo: E is T prove per E un'istanza di tipo T mentre E is! T test per E non un'istanza di tipo T.

Notare che E is Object è sempre true e null is T è sempre falso a meno che non sia T===Object.

12

Come altri hanno già menzionato, l'operatore is di Dart è l'equivalente dell'operatore di Javascript . Tuttavia, non ho trovato un analogo diretto dell'operatore typeof in Dart.

Fortunatamente lo dart:mirrors reflection API è stato recentemente aggiunto all'SDK ed è ora disponibile per il download nello latest Editor+SDK package. Ecco una breve 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 tipo ha un membro runtimeType un'istanza (fonte è da dart-sdk v1.14, non so se fosse disponibile in precedenza)

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

Uso:

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

RuntimeType è solo a scopo di debug e il codice dell'applicazione non dovrebbe dipendere da esso. Può essere sovrascritto dalle classi per restituire valori falsi e probabilmente restituisce valori inutilizzabili durante il transpiled a JS –

+0

Grazie per il tuo commento, sono abbastanza nuovo a Dart, e sono d'accordo che 'runtimeType' può essere sovrascritto dalle classi, anche se posso ' Penso a una ragione per cui lo farebbero. (Il codice esterno non può impostare il valore sinse è un getter) Personalmente, vorrei attenermi a 'is' e reflection. – sbedulin

+0

Va bene questo è menzionato qui. Non è molto ovvio che 'runtimeType' abbia queste limitazioni. –

Problemi correlati