Dart仕様には次のように記載されています。
具象化された型情報は、実行時のオブジェクトの型を反映し、動的な型チェック構造(他の言語のinstanceOf、キャスト、タイプケースなどの類似物)によって常に照会される場合があります。
素晴らしい音ですが、のinstanceof
ような演算子はありません。では、Dartでランタイム型チェックを実行するにはどうすればよいでしょうか。まったく可能ですか?
回答:
instanceof-operatorはis
Dart で呼び出されます。仕様は一般の読者にとって完全に友好的ではないため、現在のところ最も適切な説明はhttp://www.dartlang.org/articles/optional-types/のようです。
次に例を示します。
class Foo { }
main() {
var foo = new Foo();
if (foo is Foo) {
print("it's a foo!");
}
}
is
オペレーターは仕様の59ページのセクション10.30「タイプテスト」で定義されています
getTypeName(dynamic obj) => obj.runtimeType;
!=
しかしis!
...私はそれをしないの混乱
Dart Object
タイプにはruntimeType
インスタンスメンバーがあります(ソースはdart-sdk
v1.14 からです。以前に利用可能であったかどうかは不明です)
class Object {
//...
external Type get runtimeType;
}
使用法:
Object o = 'foo';
assert(o.runtimeType == String);
runtimeType
ないので、クラスによってオーバーライドされる可能性があることに同意しますが、その理由は考えられません。(外部コードはゲッターであるため、値を設定できません)個人的には、私は固執しis
ます。
runtimeType
これらの制限があることはそれほど明白ではありません。
runtimeType
デバッグ目的でのみ使用すべきケースですか?Objectのドキュメントや他の場所(私が見つけた可能性があります)でこれについての言及がないため、私は尋ねます。
object.runtimeType
オブジェクトのタイプを返します
例えば:
print("HELLO".runtimeType); //prints String
var x=0.0;
print(x.runtimeType); //prints double
他の人が述べたように、Dartのis
演算子はJavaScriptのinstanceof
演算子と同等です。しかし、私はtypeof
ダートでオペレーターの直接の類似物を見つけていません。
ありがたいことに、dart:mirrorsリフレクションAPIが最近SDKに追加され、最新のEditor + SDKパッケージでダウンロードできるようになりました。ここに短いデモがあります:
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.");
}
Unsupported operation: dart:mirrors is no longer supported for web apps
型テストには2つの演算子がありE is T
ます。Eのテストは型TのインスタンスですがE is! T
、Eのテストはそうではありません。
E is Object
は常にtrueであり、でnull is T
ない限り常にfalse であることに注意してくださいT===Object
。
T===Object
ですか?Dartには三重の等号演算子はありませんが、二重の等号ではなくそれを使用することを選択したので、違いに意味があると思います。
null is Object
言ったことは真実だと思いますがnull is T
、他のタイプのT. tbhの場合は偽です。私は何年もダートの近くにいなかったので、確信が持てません。
ただ、ビットに違いを明確にするis
ととruntimeType
。誰かがすでに言ったように(そしてこれはDart V2 +でテストされました)次のコード:
class Foo {
Type get runtimeType => String;
}
main() {
var foo = new Foo();
if (foo is Foo) {
print("it's a foo!");
}
print("type is ${foo.runtimeType}");
}
出力されます:
it's a foo!
type is String
それは間違っています。今、なぜそんなことをしなければならないのか分からない…
is
仕様に演算子の記載がないようです。それはダート源で文法ファイルにREFEREすると良いでしょう:code.google.com/p/dart/source/browse/trunk/dart/language/...