2011-10-10 94 views
21

达特规范规定:如何在Dart中执行运行时类型检查?

物化类型信息反映了类型在运行时对象的,并且可以总是通过动态类型检查构建体进行查询(}这种的 类似物,管型,典型案例等其他语言)。

听起来不错,但没有instanceof-like操作符。那么我们如何在Dart中执行运行时类型检查?它有可能吗?

回答

22

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!"); 
    } 
} 
+0

看起来在规范中根本没有提及“is”操作符。最好参考Dart来源的语法文件:https://code.google.com/p/dart/source/browse/trunk/dart/language/grammar/Dart.g – Idolon

+3

@Idolon,'is'运算符在规范的第59页中定义,第10.30节“类型测试” – Duncan

6

有两家运营商进行型式试验:E is T测试对于E T类型的实例,同时E is! T测试对于E T类型的实例

请注意,E is Object始终为真,且null is T始终为假,除非T===Object

12

正如其他人所说的,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."); 
} 
1

飞镖Object类型都有一个runtimeType实例成员(源来自dart-sdk V1.14,不知道这是否是可用更早)

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

用法:

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

RuntimeType仅用于调试目的,应用程序代码不应依赖于它。它可以被类覆盖返回假值,并可能返回不可用的值时,转换为JS –

+0

感谢您的评论,我对飞镖非常新,我同意'runtimeType'可能被类重写,虽然我可以'没想到他们会这么做的原因。 (外部代码无法设置值,因为它是一个吸气剂)就我个人而言,我会坚持'是'和反思。 – sbedulin

+0

这里提到这很好。 'runtimeType'具有这些限制并不是很明显。 –