達特規範規定:如何在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