Spesifikasi Dart menyatakan:
Informasi tipe Reified mencerminkan tipe objek pada saat runtime dan mungkin selalu ditanyai oleh konstruksi pemeriksaan tipe dinamis (analog dari instanceOf, cast, typecase, dll. Dalam bahasa lain).
Kedengarannya bagus, tapi tidak ada instanceof
operator yang mirip. Jadi bagaimana kita melakukan pemeriksaan jenis runtime di Dart? Apakah mungkin sama sekali?
dynamic
dart
instanceof
dart-mirrors
Idolon
sumber
sumber
is
operator sama sekali dalam spesifikasinya. Lebih baik merujuk ke file tata bahasa di sumber Dart: code.google.com/p/dart/source/browse/trunk/dart/language/…is
operator ditentukan pada halaman 59 dari spesifikasi, bagian 10.30 'Tes jenis'is
danis!
dapat ditemukan di bagian Operator tur bahasa Dart.getTypeName(dynamic obj) => obj.runtimeType;
!=
tapiis!
... membingungkan saya bukanObject
Jenis Dart memiliki anggotaruntimeType
instance (sumber daridart-sdk
v1.14, tidak tahu apakah itu tersedia sebelumnya)class Object { //... external Type get runtimeType; }
Pemakaian:
Object o = 'foo'; assert(o.runtimeType == String);
sumber
runtimeType
mungkin dikesampingkan oleh kelas, meskipun saya tidak dapat memikirkan alasan mengapa mereka melakukannya. (kode eksternal tidak dapat mengatur nilai karena itu pengambil) Secara pribadi, saya akan tetap berpegang padais
dan refleksi.runtimeType
memiliki batasan ini.runtimeType
seharusnya hanya digunakan untuk tujuan debugging? Saya bertanya karena tidak ada penyebutan ini di dokumen untuk Object, atau di tempat lain (yang bisa saya temukan).object.runtimeType
mengembalikan tipe objekSebagai contoh:
print("HELLO".runtimeType); //prints String var x=0.0; print(x.runtimeType); //prints double
sumber
Seperti yang telah disebutkan orang lain,
is
operator Dart setara denganinstanceof
operator Javascript . Namun, saya belum menemukan analog langsung daritypeof
operator di Dart.Untungnya, API refleksi dart: mirrors baru-baru ini telah ditambahkan ke SDK, dan sekarang tersedia untuk diunduh dalam paket Editor + SDK terbaru . Berikut demo singkatnya:
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."); }
sumber
Unsupported operation: dart:mirrors is no longer supported for web apps
Ada dua operator untuk pengujian tipe:
E is T
pengujian untuk E sebuah turunan dari tipe T sementaraE is! T
tes untuk E bukan sebuah turunan dari tipe T.Perhatikan bahwa
E is Object
selalu benar, dannull is T
selalu salah kecualiT===Object
.sumber
T===Object
? Dart tidak memiliki operator rangkap tiga sama dengan, tetapi Anda memilih untuk menggunakannya daripada menggandakan sama, jadi saya berasumsi perbedaannya memiliki signifikansi.null is Object
benar tetapinull is T
salah untuk tipe T. tbh lainnya meskipun saya belum pernah dekat Dart selama bertahun-tahun sekarang jadi tidak bisa memastikan.Hanya untuk memperjelas sedikit perbedaan antara
is
danruntimeType
. Seperti yang dikatakan seseorang (dan ini telah diuji dengan Dart V2 +) kode berikut: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}"); }
akan mengeluarkan:
it's a foo! type is String
Yang mana yang salah. Sekarang, saya tidak dapat melihat alasan mengapa seseorang harus melakukan hal seperti itu ...
sumber
Telepon saja
pada data.
sumber