La spécification Dart indique:
Les informations de type réifié reflètent les types d'objets au moment de l'exécution et peuvent toujours être interrogées par des constructions de vérification de type dynamique (les analogues de instanceOf, casts, typecase, etc. dans d'autres langues).
Ça a l'air génial, mais il n'y a pas d' instanceof
opérateur semblable à celui-ci. Alors, comment pouvons-nous effectuer la vérification de type à l'exécution dans Dart? Est-ce possible du tout?
dynamic
dart
instanceof
dart-mirrors
Idolon
la source
la source
is
opérateur dans la spécification. Il est préférable de se référer au fichier de grammaire dans les sources Dart: code.google.com/p/dart/source/browse/trunk/dart/language/…is
opérateur est défini à la page 59 de la spécification, section 10.30 `` Type test ''is
etis!
peut être trouvé dans la section Opérateurs de la visite linguistique de Dart.getTypeName(dynamic obj) => obj.runtimeType;
!=
maisis!
... me déroute pas ça faitLe
Object
type Dart a unruntimeType
membre d'instance (la source est de ladart-sdk
v1.14, je ne sais pas si elle était disponible plus tôt)Usage:
la source
runtimeType
peut être remplacé par des classes, même si je ne peux pas penser à 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 tiens à uneis
réflexion.runtimeType
a ces limites.runtimeType
ne devrait être utilisé qu'à des fins de débogage? Je demande parce qu'il n'y a aucune mention de cela dans la documentation pour Object, ou ailleurs (que j'ai pu trouver).object.runtimeType
renvoie le type d'objetPar exemple:
la source
Comme d'autres l'ont mentionné, l'
is
opérateur de Dart est l'équivalent de l'instanceof
opérateur de Javascript . Cependant, je n'ai pas trouvé d'analogue direct de l'typeof
opérateur dans Dart.Heureusement, l' API de réflexion dart: mirrors a récemment été ajoutée au SDK et est désormais disponible au téléchargement dans le dernier package Editor + SDK . Voici une courte démo:
la source
Unsupported operation: dart:mirrors is no longer supported for web apps
Il existe deux opérateurs pour les tests de type:
E is T
teste pour E une instance de type T tandis queE is! T
teste E pas une instance de type T.Notez que
E is Object
c'est toujours vrai etnull is T
toujours faux saufT===Object
.la source
T===Object
? Dart n'a pas l'opérateur triple égal, mais vous avez choisi de l'utiliser plutôt que double égal, donc je suppose que la différence a une signification.null is Object
serait vrai maisnull is T
faux pour tout autre type T. tbh bien que je ne sois pas près de Dart depuis de nombreuses années maintenant, donc je ne peux pas en être certain.Juste pour clarifier un peu la différence entre
is
etruntimeType
. Comme quelqu'un l'a déjà dit (et cela a été testé avec Dart V2 +), le code suivant:affichera:
Ce qui est faux. Maintenant, je ne vois pas la raison pour laquelle on devrait faire une telle chose ...
la source