String-lər və formatlaşdırma
Dart-da string literalları həm tək, həm cüt dırnaqla yazılır — fərq yoxdur, komanda stilinə görə seç (rəsmi lint prefer_single_quotes tək dırnağı seçir).
- Interpolation:
'Salam, $name'və mürəkkəb ifadə üçün'${user.name.toUpperCase()}'. Konkatenasiya ('a' + b) əvəzinə həmişə interpolation işlət — oxunaqlıdır vəprefer_interpolation_to_compose_stringslint qaydası bunu tələb edir. - Raw string:
r'C:\Users\path'— escape ardıcıllıqları emal olunmur. Regex pattern-ləri üçün faktiki standartdır:RegExp(r'\d{4}-\d{2}'). - Multiline: üçqat dırnaq
'''...'''. SQL sorğuları, JSON fixture-ləri və uzun mətnlər üçün. - Adjacent literals: yan-yana yazılmış literallar avtomatik birləşir — uzun mətni sətirlərə bölmək üçün əlverişlidir.
String-lər immutable-dır. Hər +, replaceAll, substring yeni obyekt yaradır. Dövr daxilində string yığmaq buna görə bahalıdır: 1000 iterasiyalı s += x 1000 aralıq obyekt yaradır və O(n²) kopyalama deməkdir.
Düzgün alət — StringBuffer: daxili bufer saxlayır, write/writeln/writeAll ilə yığır və sonda bir dəfə toString() edir.
Sadə birləşdirmələr üçün alternativlər də var: list.join(', ') (ən oxunaqlısı), '$a$b' interpolation. Praktik qayda: dövr varsa `StringBuffer` və ya `join`, dövr yoxdursa interpolation.
Emoji `length`-i sındırır. Dart-da String UTF-16 code unit ardıcıllığıdır və length code unit sayını qaytarır, simvol sayını yox.
'a'.length→ 1'é'.length→ 1 (əvvəlcədən birləşdirilmiş forma)'😀'.length→ 2 — bu emoji BMP-dən kənardır və surrogate pair ilə kodlanır'👨👩👧'.length→ 8 — ailə emojisi zero-width joiner ilə birləşdirilmiş bir neçə code point-dir
Üç səviyyəni ayır: code unit (codeUnits, UTF-16), code point / rune (runes), grapheme cluster (istifadəçinin "bir simvol" saydığı şey). runes ikinci səviyyəni verir, amma ailə emojisi və ya bayraqlar üçün yenə də kifayət etmir — orada characters paketindəki .characters extension-ı lazımdır.
Praktik nəticə: istifadəçi mətnini substring ilə kəsmək (text.substring(0, 20) kimi "..." düzəltmək) emoji ortasında sındıra bilər və pozulmuş simvol göstərir.
| Əməliyyat | Metod | Qeyd |
|---|---|---|
| Ədədə çevirmə | `int.tryParse(s)` | `parse` atır, `tryParse` `null` qaytarır — istifadəçi girişində `tryParse` |
| Onluq dəqiqlik | `x.toStringAsFixed(2)` | Yuvarlaqlaşdırır və string qaytarır |
| Doldurma | `s.padLeft(2, '0')` | Vaxt formatlaması üçün tipik |
| Bölmə / birləşdirmə | `s.split(',')`, `list.join(', ')` | `join` dövrdən oxunaqlıdır |
| Boşluqların təmizlənməsi | `s.trim()` | Form validasiyasında ilk addım |
| Boşluq yoxlaması | `s.isEmpty`, `s.trim().isEmpty` | `s == ''` yazma |
| Axtarış / əvəzləmə | `contains`, `replaceAll`, `RegExp` | Regex pattern-ini raw string kimi yaz |
Interview ipucu. '😀'.length sualı çox verilir və gözlənilən cavab "1" deyil. Güclü cavab: "2 — çünki Dart string-i UTF-16 code unit ardıcıllığıdır, bu emoji isə surrogate pair-dir. Real simvol sayı üçün `runes` (code point) və ya `characters` paketinin `.characters` (grapheme cluster) istifadə olunur." Bunun praktik təsirini əlavə et: mətni substring ilə kəsmək emojini yarıya bölə bilər.
İkinci tez-tez verilən sual: "Dövr içində `s += x` nə ilə pisdir?" — cavabda immutability, O(n²) kopyalama və StringBuffer alternativini bir cümlədə birləşdir.
📚 Mənbələr və sənədlər
- String classrəsmiapi.dart.dev