Dart 사양은 다음과 같이 설명합니다.
수정 된 유형 정보는 런타임시 객체 유형을 반영하며 항상 동적 유형 검사 구조 (다른 언어의 instanceOf, 캐스트, 유형 케이스 등의 유사체)에 의해 쿼리 될 수 있습니다.
훌륭하게 들리지만 instanceof
유사 연산자 는 없습니다 . 그렇다면 Dart에서 런타임 유형 검사를 어떻게 수행할까요? 전혀 가능합니까?
답변
instanceof-operator는 is
Dart에서 호출 됩니다. 사양은 평범한 독자에게 정확히 친숙하지 않으므로 현재 가장 좋은 설명은 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-sdk
v1.14 에서 가져온 것입니다. 이전에 사용 가능했는지 알 수 없음)
class Object {
//...
external Type get runtimeType;
}
용법:
Object o = 'foo';
assert(o.runtimeType == String);
답변
object.runtimeType
객체의 유형을 반환
예를 들면 :
print("HELLO".runtimeType); //prints String
var x=0.0;
print(x.runtimeType); //prints double
답변
다른 사람들이 언급했듯이 Dart의 is
연산자는 Javascript의 instanceof
연산자 와 동일 합니다. 그러나 typeof
Dart 에서 연산자와 직접적인 유사점을 찾지 못했습니다 .
고맙게도 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! T
E를위한 테스트 하지 T 형식의 인스턴스
참고 E is Object
항상 true이고, null is T
항상하지 않는 한 false입니다 T===Object
.
답변
그냥 조금에게 차이 명확하게 is
와 runtimeType
. 누군가가 이미 말했듯이 (그리고 이것은 Dart V2 +로 테스트되었습니다) 다음 코드 :
class Foo {
Type get runtimeType => String;
}
main() {
var foo = new Foo();
if (foo is Foo) {
print("it's a foo!");
}
print("type is ${foo.runtimeType}");
}
다음을 출력합니다.
it's a foo!
type is String
어느 것이 잘못되었습니다. 이제 왜 그런 일을해야하는지 모르겠네요 …