2011-10-10 4 views
21

états de spécification Dart:Comment effectuer une vérification de type à l'exécution dans Dart?

informations de type réifié reflète les types d'objets à l'exécution et peut toujours être interrogé par des constructions de contrôle de type dynamique (les analogues de instanceOf, moulages, Typecase etc. dans d'autres langues).

Semble bien, mais il n'y a pas d'opérateur instanceof. Alors, comment pouvons-nous effectuer une vérification de type à l'exécution dans Dart? Est-ce possible?

Répondre

22

L'instanceof-operator est appelé is dans Dart. La spécification n'est pas vraiment conviviale pour un lecteur occasionnel, donc la meilleure description semble être http://www.dartlang.org/articles/optional-types/.

Voici un exemple:

class Foo { } 

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

Il semble qu'il n'y ait aucune mention de l'opérateur 'is' dans la spécification. Il est préférable de se référer au fichier de grammaire dans les sources Dart: https://code.google.com/p/dart/source/browse/trunk/dart/language/grammar/Dart.g – Idolon

+3

@Idolon, l'opérateur 'is' est défini à la page 59 de la spécification, section 10.30 'Test de type' – Duncan

6

Il y a deux opérateurs pour les essais de type: E is T tests pour E une instance de type T tandis que E is! T tests pour E pas une instance de type T.

Notez que E is Object est toujours vrai et null is T est toujours faux sauf si T===Object.

12

Comme d'autres l'ont mentionné, l'opérateur is de Dart est l'équivalent de l'opérateur instanceof de Javascript. Cependant, je n'ai pas trouvé d'analogue direct de l'opérateur typeof dans Dart.

Heureusement, le dart:mirrors reflection API a été récemment ajouté au SDK et est maintenant disponible au téléchargement dans le latest Editor+SDK package. Voici une courte démo:

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 Type Object a un membre de l'instance runtimeType (source de dart-sdk v1.14, ne savent pas si elle était disponible plus tôt)

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

Utilisation:

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

RuntimeType est uniquement à des fins de débogage et le code de l'application ne doit pas en dépendre. Il peut être ignoré par les classes pour renvoyer de fausses valeurs et retourne probablement des valeurs inutilisables lorsqu'il est transmis à JS –

+0

Merci pour votre remarque, je suis assez nouveau pour Dart, et je suis d'accord que 'runtimeType' peut être surchargé par les classes, bien que je puisse ' Je pense à une raison pour laquelle ils le feraient. (le code externe ne peut pas définir la valeur sinse c'est un getter) Personnellement, je m'en tiendrai à 'is' et à la réflexion. – sbedulin

+0

C'est bien, c'est mentionné ici. Il n'est pas très évident que 'runtimeType' a ces limitations. –

Questions connexes