Estados de especificação do Dart:
As informações de tipo reificado refletem os tipos de objetos em tempo de execução e podem sempre ser consultadas por construções dinâmicas de verificação de tipos (os análogos de instanceOf, casts, typecase etc. em outras linguagens).
Parece ótimo, mas não há um instanceof
operador semelhante. Então, como executamos a verificação de tipo em tempo de execução no Dart? É possível de alguma forma?
dynamic
dart
instanceof
dart-mirrors
Idolon
fonte
fonte
is
operador na especificação. É melhor consultar o arquivo de gramática nas fontes do DARTis
operador é definido na página 59 da especificação, seção 10.30 'Teste de tipo'is
eis!
podem ser encontrados na seção Operadores do tour linguístico Dart.getTypeName(dynamic obj) => obj.runtimeType;
!=
masis!
... me confunde, nãoO
Object
tipo de dardo tem umruntimeType
membro de instância (a fonte édart-sdk
v1.14, não sei se estava disponível anteriormente)Uso:
fonte
runtimeType
pode ser anulado por classes, embora não consiga pensar em uma razão para isso. (o código externo não pode definir o valor senão é um getter) Pessoalmente, gostaria de manter umais
reflexão.runtimeType
tenha essas limitações.runtimeType
deve ser usado apenas para fins de depuração? Eu pergunto porque não há nenhuma menção disso nos documentos do Object, ou em outro lugar (que eu possa encontrar).object.runtimeType
retorna o tipo de objetoPor exemplo:
fonte
Como outros mencionaram, o
is
operador do Dart é equivalente aoinstanceof
operador do Javascript . No entanto, não encontrei um análogo direto datypeof
operadora no Dart.Felizmente, a API de reflexão dart: mirrors foi adicionada recentemente ao SDK e agora está disponível para download no pacote Editor + SDK mais recente . Aqui está uma breve demonstração:
fonte
Unsupported operation: dart:mirrors is no longer supported for web apps
Existem dois operadores para o teste de tipo:
E is T
testa para E uma instância do tipo T enquantoE is! T
testes para E não é uma instância do tipo T.Observe que
E is Object
é sempre verdadeiro enull is T
sempre falso, a menos queT===Object
.fonte
T===Object
? O Dart não tem o operador triplo igual, mas você optou por usá-lo em vez de duplo igual, então presumo que a diferença seja significativa.null is Object
que seria verdadeiro, masnull is T
falso para qualquer outro tipo de T. tbh, embora eu não tenha estado perto de Dart por muitos anos, então não posso ter certeza.Só para esclarecer um pouco a diferença entre
is
eruntimeType
. Como alguém já disse (e isso foi testado com Dart V2 +) o seguinte código:irá produzir:
O que está errado. Agora, eu não consigo ver a razão pela qual alguém deveria fazer tal coisa ...
fonte