Sparround

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_strings lint 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)
  • '😀'.length2 — 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əliyyatMetodQeyd
Ə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

), və regex-i sinif səviyyəsində static final kimi saxlayıram ki, hər çağırışda yenidən compile olunmasın. Sonda mühüm bir prinsip əlavə et: validasiya qaydası UI-də deyil, model və ya validator sinfində yaşamalıdır ki, testlə örtülə bilsin."}}]}