2011-10-10 90 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'具有這些限制並不是很明顯。 –