dynamic - ¿Cómo se realiza la verificación del tipo de tiempo de ejecución en Dart?
instanceof dart-mirrors (4)
La especificación Dart declara:
La información del tipo reificado refleja los tipos de objetos en tiempo de ejecución y siempre puede ser consultada mediante construcciones dinámicas de comprobación de tipos (los análogos de instanceOf, cast, typecase, etc. en otros idiomas).
Suena genial, pero no hay un operador de tipo instanceof
of. Entonces, ¿cómo realizamos la verificación de tipo de tiempo de ejecución en Dart? ¿Es posible?
Como otros han mencionado, el operador Dart''s is
es el equivalente del operador instanceof
de Javascript. Sin embargo, no he encontrado un análogo directo del operador typeof
en Dart.
Afortunadamente, la API dart: mirrors reflection se ha agregado recientemente al SDK y ahora está disponible para su descarga en el último paquete de Editor + SDK . Aquí hay una breve demostración:
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.");
}
El operador de instancia se llama is
en Dart. La especificación no es exactamente amigable para un lector casual, por lo que la mejor descripción en este momento parece ser http://www.dartlang.org/articles/optional-types/ .
Aquí hay un ejemplo:
class Foo { }
main() {
var foo = new Foo();
if (foo is Foo) {
print("it''s a foo!");
}
}
Hay dos operadores para la prueba de tipo: E is T
prueba para E una instancia de tipo T mientras E is! T
E is! T
pruebas E is! T
para E no son una instancia de tipo T.
Tenga en cuenta que E is Object
siempre es verdadero, y null is T
siempre falso a menos que T===Object
.
Object
tipo de Object
Dart tiene un miembro de instancia de runtimeType
(la fuente es de dart-sdk
v1.14, no sé si estuvo disponible anteriormente)
class Object {
//...
external Type get runtimeType;
}
Uso:
Object o = ''foo'';
assert(o.runtimeType == String);