Sparround

Dəyişənlər və tiplər

Dart-da dəyişən elan etməyin üç praktik yolu var:

  • var — tip inference ilə elan. Tip ilk mənimsətmədən çıxarılır və dəyişmir: var n = 1; sonra n = 'salam'; compile xətasıdır.
  • final — bir dəfə mənimsədilir, dəyəri runtime-da hesablana bilər: final now = DateTime.now();
  • const — dəyər compile-time-da tam məlum olmalıdır: const pi = 3.14;

Tipi açıq yazmaq da olar: int count = 0;. Komanda kodunda adət belədir: public API-lərdə tipi açıq yaz, lokal dəyişənlərdə final + inference kifayətdir.

finalconst arasındakı fərq interview-da demək olar ki, həmişə soruşulur.

  • final referensin dəyişməzliyidir: final list = [1, 2]; sonra list.add(3); tamamilə qanunidir — dəyişən yeni siyahıya işarə edə bilmir, amma siyahının özü mutable-dır.
  • const dərin (deep) dəyişməzlikdir: const list = [1, 2]; yaratdığı siyahı immutable-dır, list.add(3) runtime-da UnsupportedError atır.

Bundan başqa const canonicalisation verir: eyni const ifadəsi proqram boyu bir dənə obyekt yaradır, ona görə identical(const [1, 2], const [1, 2])true.

Xüsusiyyət`var``final``const`
Yenidən mənimsətməBəliXeyrXeyr
Dəyər nə vaxt məlum olurRuntimeRuntimeCompile-time
Obyektin içi dəyişəndir?BəliBəliXeyr — deep immutable
CanonicalisationYoxYoxVar
Sinif sahəsi (field) ola bilər?BəliBəliYalnız `static const`

Ədədi tiplər. num — abstrakt bazadır, intdouble onun alt tipləridir. Amma int `double`-in alt tipi deyil — bu, ən çox rast gəlinən tələdir:

  • double x = 5; işləyir, çünki compiler ədəd literalını 5.0 kimi oxuyur (yalnız literal üçün!).
  • int n = 5; double x = n; compile xətasıdırn.toDouble() yazmaq lazımdır.

Digər fərq: / həmişə double qaytarır (7 / 2 == 3.5), tam bölmə üçün ~/ var (7 ~/ 2 == 3). Web-də (dart2js) int əslində JS ədədidir, ona görə 64-bit tam ədədlərə güvənmə.

`dynamic` vs `var`. var — "tipi sən çıxar", tip yenə də statik yoxlanılır. dynamic — "yoxlamanı söndür": dynamic d = 5; d.foo(); compile olunur və runtime-da NoSuchMethodError atır. dynamic yalnız JSON kimi tipsiz sərhədlərdə istifadə olunmalı, dərhal real tipə çevrilməlidir.

Interview ipucu. "const niyə Flutter-da vacibdir?" sualı klassikdir. Güclü cavab iki hissədən ibarətdir: (1) const obyekt compile-time-da bir dəfə yaradılır və canonicalise olunur, ona görə hər rebuild-də yenidən allocate olunmur; (2) framework identical() müqayisəsi ilə həmin alt-ağacın dəyişmədiyini görüb işi buraxa bilir. Zəif cavab "performans üçün yaxşıdır" deyib dayanmaqdır — nə üçün yaxşı olduğunu izah et.

Ən çox edilən səhv: final ilə const-u "eyni şeyin iki adı" kimi təqdim etmək. Fərqi bir cümlə ilə de: "`final` — bir dəfə mənimsətmə, dəyər runtime-da hesablana bilər; `const` — compile-time sabiti və deep immutable."

📚 Mənbələr və sənədlər