Dipende dal fatto se si desidera eseguire iterazioni su unità di codice o punti di codice. Il linguaggio stesso itera su array di elementi di matrice e le stringhe sono array di unità di codice, quindi se è sufficiente utilizzare foreach
con inferenza di tipo, quindi con
foreach(c; "La Verité")
writeln(c);
gli ultimi due caratteri stampati sarebbe senza senso, perché é
è un punto di codice composto da due unità di codice UTF-8 e si stampano unità di codice individuali (poiché char
è un'unità di codice UTF-8). Considerando che, se si fa
foreach(dchar c; "La Verité")
writeln(c);
quindi il runtime decodificare le unità di codice di punti di codice, e é
verrà stampato come ultimo carattere. Ma niente di tutto ciò funziona realmente su stringhe come intervalli. foreach
opera su array in modo nativo senza dover utilizzare l'API dell'intervallo di input. Tuttavia, per tutti i tipi di stringa, l'API gamma assomiglia
@property bool empty();
@property dchar front();
void popFront();
Esso opera su stringhe come gamme di dchar
- non loro tipo di unità di codice. Ciò evita problemi con funzioni come std.algorithm.filter
che operano su singole unità di codice, poiché ciò non avrebbe senso. Operare sui punti di codice non è corretto al 100%, dal momento che Unicode diventa molto complicato per quanto riguarda la combinazione di punti di codice e grafemi e quant'altro, ma operare su punti di codice è molto più vicino all'essere corretto (e credo che ci sia lavoro per aggiungere gamma supporto per i grafemi nella libreria standard per i casi in cui è necessario e sono disposti a pagare il successo in termini di prestazioni). Quindi, avendo l'API gamma per le stringhe operano su di loro come gamme di dchar
è molto più corretto, e se hai fatto qualcosa di simile
foreach(c; filter!"true"("La Verité"))
writeln(c);
si sarebbe iterazione sopra dchar
e é
sarebbe stampare correttamente.Il lato negativo di tutto questo è ovviamente il fatto che foreach
su stringhe opera a livello di unità di codice per impostazione predefinita mentre l'API di intervallo per stringhe opera su di esse come punti di codice, quindi è necessario fare attenzione quando si mischiano operazioni di array e range-based operazioni su stringhe. Questo è anche il motivo per cui string
e wstring
non sono considerati intervalli di accesso casuale, ma solo intervalli bidirezionali. Non è possibile eseguire l'accesso casuale in O (1) sui punti di codice quando sono costituiti da un numero variabile di unità di codice (mentre dstring
è un intervallo di accesso casuale, poiché con UTF-32 ogni unità di codice è un punto di codice).
fonte
2013-05-16 17:25:37
http://ddili.org/ders/d.en/ranges.html – sigod
@sigod, sì, avrebbe dovuto controllare il libro di Ali! È sicuramente la risorsa giusta per leggere su D stuff in questo momento. –