Dart规范指出:
修饰的类型信息反映了运行时对象的类型,并且始终可以通过动态类型检查构造(其他语言中的instanceOf,casts,typecase等类似物)查询。
听起来不错,但没有instanceof
类似运算符。那么我们如何在Dart中执行运行时类型检查?有可能吗?
Answers:
is
Dart中称为instanceof-operator 。该规范对休闲读者并不十分友好,因此,目前最好的描述似乎是http://www.dartlang.org/articles/optional-types/。
这是一个例子:
class Foo { }
main() {
var foo = new Foo();
if (foo is Foo) {
print("it's a foo!");
}
}
is
操作被定义规范的第59页,部分10.30“型式试验”
getTypeName(dynamic obj) => obj.runtimeType;
!=
但是is!
...让我感到困惑,不是
Dart Object
类型有一个runtimeType
实例成员(源于dart-sdk
v1.14,不知道它是否较早可用)
class Object {
//...
external Type get runtimeType;
}
用法:
Object o = 'foo';
assert(o.runtimeType == String);
runtimeType
可以被类覆盖,尽管我想不出为什么会这么做。(外部代码无法设置值,因为这是一个吸气剂)就个人而言,我会坚持is
并反思。
runtimeType
有这些局限性不是很明显。
runtimeType
应该只用于调试目的吗?我问是因为在Object或其他地方(我能找到)的文档中都没有提及这一点。
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.");
}
Unsupported operation: dart:mirrors is no longer supported for web apps
is
规范中根本没有提到运算符。这是更好地参考,在飞镖源语法文件:code.google.com/p/dart/source/browse/trunk/dart/language/...