2011-10-10 9 views
21

ダート仕様状態:Dartで実行時の型チェックを実行する方法は?

具体化タイプ情報は、実行時にオブジェクトのタイプを反映し、常に動的な型チェックコンストラクトによって問い合わせることができる(INSTANCEOFの 類似体、キャスト、typecaseなど他の言語で)。

素晴らしいですが、instanceofのようなオペレータはありません。では、Dartでランタイム型チェックを実行するにはどうすればよいですか?まったく可能ですか?

答えて

22

Dartでは、instanceof-operatorは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

型式試験のための2つの演算子がありますEためE is TテストタイプTのインスタンスE ないためE is! T試験型T

のインスタンス一方がE is Objectは常にtrueであり、以外の場合はnull is Tは常にfalseです。

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

ランタイムタイプはデバッグ目的のみであり、アプリケーションコードはそれに依存してはいけません。これは、偽の値を返すためにクラスによってオーバーライドされ、おそらく使用不可能な値を返します。 –

+0

私はDartを初めて使い慣れたので、 'runtimeType'はクラスによってオーバーライドされるかもしれませんが、彼らがなぜそう思うか考える。 (外部コードは値を設定できません。ゲッターです)個人的には、私は 'is'とリフレクションに固執します。 – sbedulin

+0

これはここで言及されています。 'runtimeType'にこれらの制限があることはあまり明白ではありません。 –

関連する問題