La especificación de dardo dice:
La información de tipo reificada refleja los tipos de objetos en tiempo de ejecución y siempre puede ser consultada por construcciones dinámicas de verificación de tipo (los análogos de instanceOf, casts, typecase, etc. en otros lenguajes).
Suena genial, pero no hay un instanceof
operador similar. Entonces, ¿cómo realizamos la verificación de tipos en tiempo de ejecución en Dart? ¿Es posible en absoluto?
dynamic
dart
instanceof
dart-mirrors
Ídolo
fuente
fuente
is
operador en absoluto en la especificación. Es mejor consultar el archivo de gramática en las fuentes de Dart: code.google.com/p/dart/source/browse/trunk/dart/language/…is
operador se define en la página 59 de la especificación, sección 10.30 'Prueba de tipo'is
yis!
se puede encontrar en la sección Operadores del recorrido lingüístico de Dart.getTypeName(dynamic obj) => obj.runtimeType;
!=
perois!
... me confunde, no lo haceEl
Object
tipo de dardo tiene unruntimeType
miembro de instancia (la fuente es dedart-sdk
v1.14, no sé si estaba disponible antes)Uso:
fuente
runtimeType
las clases pueden anularlo, aunque no puedo pensar en una razón por la que lo harían. (el código externo no puede establecer el valor porque es un captador) Personalmente, me apegaría a unais
reflexión.runtimeType
tenga estas limitaciones.runtimeType
solo debería utilizarse con fines de depuración? Lo pregunto porque no hay ninguna mención de esto en los documentos de Object, o en otro lugar (que pueda encontrar).object.runtimeType
devuelve el tipo de objetoPor ejemplo:
fuente
Como han mencionado otros, el
is
operador de Dart es el equivalente alinstanceof
operador de Javascript . Sin embargo, no he encontrado un análogo directo deltypeof
operador en Dart.Afortunadamente, la API de reflexión de dart: mirrors se ha agregado recientemente al SDK y ahora está disponible para descargar en el último paquete Editor + SDK . Aquí hay una breve demostración:
fuente
Unsupported operation: dart:mirrors is no longer supported for web apps
Hay dos operadores para las pruebas de tipo:
E is T
prueba para E una instancia de tipo T mientras queE is! T
prueba para E no una instancia de tipo T.Tenga en cuenta que
E is Object
siempre es cierto ynull is T
siempre es falso a menos queT===Object
.fuente
T===Object
? Dart no tiene el operador triple igual, pero eligió usarlo en lugar de doble igual, así que supongo que la diferencia tiene importancia.null is Object
que sería cierto peronull is T
falso para cualquier otro tipo T. tbh, aunque no he estado cerca de Dart durante muchos años, así que no puedo estar seguro.Solo para aclarar un poco la diferencia entre
is
yruntimeType
. Como alguien dijo ya (y esto fue probado con Dart V2 +) el siguiente código:dará salida:
Cuál está mal. Ahora, no veo la razón por la que uno debería hacer tal cosa ...
fuente