development

Dart에서 런타임 유형 검사를 수행하는 방법은 무엇입니까?

big-blog 2020. 12. 7. 20:12
반응형

Dart에서 런타임 유형 검사를 수행하는 방법은 무엇입니까?


Dart 사양은 다음과 같이 설명합니다.

수정 된 유형 정보는 런타임시 객체 유형을 반영하며 항상 동적 유형 검사 구조 (다른 언어의 instanceOf, 캐스트, 유형 케이스 등의 유사체)에 의해 쿼리 될 수 있습니다.

훌륭하게 들리지만 instanceof유사 연산자 는 없습니다 . 그렇다면 Dart에서 런타임 유형 검사를 어떻게 수행할까요? 전혀 가능합니까?


instanceof-operator는 isDart에서 호출 됩니다. 사양은 평범한 독자에게 정확히 친숙하지 않으므로 현재 가장 좋은 설명은 http://www.dartlang.org/articles/optional-types/ 입니다.

예를 들면 다음과 같습니다.

class Foo { }

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

Dart Object유형에 runtimeType인스턴스 멤버가 있습니다 (소스는 dart-sdkv1.14 에서 왔으며 이전에 사용 가능했는지 알 수 없음)

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

용법:

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

다른 사람들이 언급했듯이 Dart의 is연산자는 Javascript의 instanceof연산자 와 동일 합니다. 그러나 나는 typeofDart 에서 연산자 의 직접적인 아날로그를 찾지 못했습니다 .

고맙게도 dart : mirrors 리플렉션 API 가 최근 SDK에 추가되었으며 현재 최신 Editor + SDK 패키지 에서 다운로드 할 수 있습니다 . 다음은 짧은 데모입니다.

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.");
}

유형 테스트를위한 두 개의 연산자가 있습니다 : E is T테스트는 E, 형태 T의 인스턴스는 동안 E is! TE를위한 테스트 하지 T 형식의 인스턴스

참고 E is Object항상 true이고, null is T항상하지 않는 한 false입니다 T===Object.


object.runtimeType 객체의 유형을 반환

예를 들면 :

print("HELLO".runtimeType); //prints String
var x=0.0;
print(x.runtimeType); //prints double

작은 패키지는 몇 가지 문제를 해결하는 데 도움이 될 수 있습니다.

import 'dart:async';

import 'package:type_helper/type_helper.dart';

void main() {
  if (isTypeOf<B<int>, A<num>>()) {
    print('B<int> is type of A<num>');
  }

  if (!isTypeOf<B<int>, A<double>>()) {
    print('B<int> is not a type of A<double>');
  }

  if (isTypeOf<String, Comparable<String>>()) {
    print('String is type of Comparable<String>');
  }

  var b = B<Stream<int>>();
  b.doIt();
}

class A<T> {
  //
}

class B<T> extends A<T> {
  void doIt() {
    if (isTypeOf<T, Stream>()) {
      print('($T): T is type of Stream');
    }

    if (isTypeOf<T, Stream<int>>()) {
      print('($T): T is type of Stream<int>');
    }
  }
}

결과:

B<int> is type of A<num> B<int> is not a type of A<double> String is type of Comparable<String> (Stream<int>): T is type of Stream (Stream<int>): T is type of Stream<int>

참고URL : https://stackoverflow.com/questions/7715948/how-to-perform-runtime-type-checking-in-dart

반응형