ダート仕様状態:Dartで実行時の型チェックを実行する方法は?
具体化タイプ情報は、実行時にオブジェクトのタイプを反映し、常に動的な型チェックコンストラクトによって問い合わせることができる(INSTANCEOFの 類似体、キャスト、typecaseなど他の言語で)。
素晴らしいですが、instanceof
のようなオペレータはありません。では、Dartでランタイム型チェックを実行するにはどうすればよいですか?まったく可能ですか?
ダート仕様状態:Dartで実行時の型チェックを実行する方法は?
具体化タイプ情報は、実行時にオブジェクトのタイプを反映し、常に動的な型チェックコンストラクトによって問い合わせることができる(INSTANCEOFの 類似体、キャスト、typecaseなど他の言語で)。
素晴らしいですが、instanceof
のようなオペレータはありません。では、Dartでランタイム型チェックを実行するにはどうすればよいですか?まったく可能ですか?
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!");
}
}
型式試験のための2つの演算子がありますEためE is T
テストタイプTのインスタンスE ないためE is! T
試験型T
のインスタンス一方がE is Object
は常にtrueであり、以外の場合はnull is T
は常にfalseです。
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);
ランタイムタイプはデバッグ目的のみであり、アプリケーションコードはそれに依存してはいけません。これは、偽の値を返すためにクラスによってオーバーライドされ、おそらく使用不可能な値を返します。 –
私はDartを初めて使い慣れたので、 'runtimeType'はクラスによってオーバーライドされるかもしれませんが、彼らがなぜそう思うか考える。 (外部コードは値を設定できません。ゲッターです)個人的には、私は 'is'とリフレクションに固執します。 – 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