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;sonran = '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.
final və const arasındakı fərq interview-da demək olar ki, həmişə soruşulur.
finalreferensin dəyişməzliyidir:final list = [1, 2];sonralist.add(3);tamamilə qanunidir — dəyişən yeni siyahıya işarə edə bilmir, amma siyahının özü mutable-dır.constdərin (deep) dəyişməzlikdir:const list = [1, 2];yaratdığı siyahı immutable-dır,list.add(3)runtime-daUnsupportedErroratı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əli | Xeyr | Xeyr |
| Dəyər nə vaxt məlum olur | Runtime | Runtime | Compile-time |
| Obyektin içi dəyişəndir? | Bəli | Bəli | Xeyr — deep immutable |
| Canonicalisation | Yox | Yox | Var |
| Sinif sahəsi (field) ola bilər? | Bəli | Bəli | Yalnız `static const` |
Ədədi tiplər. num — abstrakt bazadır, int və double 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.0kimi oxuyur (yalnız literal üçün!).int n = 5; double x = n;compile xətasıdır —n.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
- Dəyişənlərrəsmidart.dev
- Daxili tiplərrəsmidart.dev