达特规范规定:如何在Dart中执行运行时类型检查?
物化类型信息反映了类型在运行时对象的,并且可以总是通过动态类型检查构建体进行查询(}这种的 类似物,管型,典型案例等其他语言)。
听起来不错,但没有instanceof
-like操作符。那么我们如何在Dart中执行运行时类型检查?它有可能吗?
达特规范规定:如何在Dart中执行运行时类型检查?
物化类型信息反映了类型在运行时对象的,并且可以总是通过动态类型检查构建体进行查询(}这种的 类似物,管型,典型案例等其他语言)。
听起来不错,但没有instanceof
-like操作符。那么我们如何在Dart中执行运行时类型检查?它有可能吗?
Dart中的instanceof运算符称为is
。这个规范对一个休闲读者来说并不是很友好,所以现在最好的描述似乎是http://www.dartlang.org/articles/optional-types/。
下面是一个例子:
class Foo { }
main() {
var foo = new Foo();
if (foo is Foo) {
print("it's a foo!");
}
}
有两家运营商进行型式试验:E is T
测试对于E T类型的实例,同时E is! T
测试对于E 不 T类型的实例
请注意,E is Object
始终为真,且null is T
始终为假,除非T===Object
。
正如其他人所说的,Dart的is
运算符相当于Javascript的instanceof
运算符。但是,我还没有发现Dart中的typeof
运营商的直接模拟。
谢天谢地dart:mirrors reflection API最近被添加到SDK中,现在可以在latest Editor+SDK package下载。这里有一个简短的演示:
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.");
}
飞镖Object
类型都有一个runtimeType
实例成员(源来自dart-sdk
V1.14,不知道这是否是可用更早)
class Object {
//...
external Type get runtimeType;
}
用法:
Object o = 'foo';
assert(o.runtimeType == String);
RuntimeType仅用于调试目的,应用程序代码不应依赖于它。它可以被类覆盖返回假值,并可能返回不可用的值时,转换为JS –
感谢您的评论,我对飞镖非常新,我同意'runtimeType'可能被类重写,虽然我可以'没想到他们会这么做的原因。 (外部代码无法设置值,因为它是一个吸气剂)就我个人而言,我会坚持'是'和反思。 – sbedulin
这里提到这很好。 'runtimeType'具有这些限制并不是很明显。 –
看起来在规范中根本没有提及“is”操作符。最好参考Dart来源的语法文件:https://code.google.com/p/dart/source/browse/trunk/dart/language/grammar/Dart.g – Idolon
@Idolon,'is'运算符在规范的第59页中定义,第10.30节“类型测试” – Duncan