|
| 1 | +- title: Capitolo 6 - Testo |
| 2 | + content_markdown: > |
| 3 | + Ora che abbiamo capito un po' come Rust pensa alla memoria, siamo pronti |
| 4 | + parlare del testo in modo più dettagliato. |
| 5 | +
|
| 6 | + Rust si preoccupa molto del testo internazionale e il livello dei byte ti preoccupa |
| 7 | + potrebbe non avere familiarità con |
| 8 | +
|
| 9 | + da altre lingue. Detto questo, Rust ha molti ottimi strumenti per la gestione |
| 10 | + quelle preoccupazioni. |
| 11 | +- title: Stringhe letterali |
| 12 | + content_markdown: > |
| 13 | + Le stringhe letterali sono sempre Unicode. |
| 14 | +
|
| 15 | +
|
| 16 | + I tipi di stringhe letterali sono `&'static str`: |
| 17 | +
|
| 18 | +
|
| 19 | + * `&` significa che si riferisce a un luogo nella memoria e manca a |
| 20 | + `&mut` significa che il compilatore non consentirà modifiche |
| 21 | +
|
| 22 | + * `'statico` significa che i dati della stringa saranno disponibili fino alla fine del nostro |
| 23 | + programma (non si interrompe mai) |
| 24 | +
|
| 25 | + * `str` significa che punta a una sequenza di byte sempre validi |
| 26 | + **utf-8** |
| 27 | +
|
| 28 | +
|
| 29 | + Dettagli della memoria: |
| 30 | +
|
| 31 | + * Il compilatore Rust probabilmente inserirà la tua stringa nel segmento dati del tuo file |
| 32 | + memoria del programma |
| 33 | + code: >- |
| 34 | + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021 |
| 35 | +- title: Cos'è utf-8 |
| 36 | + content_markdown: "Poiché sui computer venivano utilizzate più lingue, il mondo aveva bisogno di rappresentare più caratteri di testo\ndi quelli consentiti dall'ASCII (1 byte consentiva solo 256 caratteri). \n\n**utf-8** è stato introdotto con una lunghezza in byte variabile di 1 -4 byte aumentando notevolmente la gamma di caratteri possibili.\n\nUn vantaggio dei caratteri di dimensione variabile è che il testo non ha byte non necessari per ASCII molto comuni (richiede solo 1 byte ancora in **utf-8**).\n\ nUno svantaggio dei caratteri di dimensione variabile è che la ricerca dei caratteri non può più essere eseguita rapidamente \n(**O(1)** tempo costante) con una semplice indicizzazione (ad esempio `mio_testo[3]` per ottenere il quarto carattere). possibile che i \ncaratteri precedenti possano avere larghezze variabili, alterando il punto in cui inizia effettivamente il 4° carattere nella sequenza di byte.\n\nDobbiamo invece scorrere una sequenza di byte **utf-8** per capire dove iniziano effettivamente i caratteri Unicode (**O(n)** tempo lineare).\n\nFerris: \"Per lo più sono semplicemente felice di avere **utf-8** per rappresentare gli emoji dei miei amici sott'acqua.\"\n\n< span class=\"emoji\">\U0001F420\U0001F419\U0001F41F\U0001F42C\U0001F40B</span>\n" |
| 37 | +- title: Personaggi in fuga |
| 38 | + content_markdown: > |
| 39 | + È difficile rappresentare visivamente alcuni personaggi, quindi **scappare |
| 40 | + i codici** ci permettono di mettere un simbolo al loro posto. |
| 41 | +
|
| 42 | +
|
| 43 | + Rust supporta i comuni codici di escape dei linguaggi basati su C: |
| 44 | +
|
| 45 | + * `\n` - nuova riga |
| 46 | +
|
| 47 | + * `\r` - ritorno a capo |
| 48 | +
|
| 49 | + * `\t` - tab |
| 50 | +
|
| 51 | + * `\\` - barra rovesciata |
| 52 | +
|
| 53 | + * `\0` - nullo |
| 54 | +
|
| 55 | + * `\'` - virgoletta singola |
| 56 | +
|
| 57 | +
|
| 58 | + L'elenco completo esiste |
| 59 | + [here](https://doc.rust-lang.org/reference/tokens.html). |
| 60 | + code: >- |
| 61 | + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021 |
| 62 | +- title: Stringhe letterali su più righe |
| 63 | + content_markdown: | |
| 64 | + Le stringhe di ruggine sono multiline per impostazione predefinita. |
| 65 | +
|
| 66 | + Usa un `\` alla fine di una riga se non si desidera una pausa. |
| 67 | + code: >- |
| 68 | + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021 |
| 69 | +- title: Stringhe letterali grezze |
| 70 | + content_markdown: > |
| 71 | + Le stringhe grezze ci consentono di scrivere una sequenza di caratteri parola per parola iniziando |
| 72 | + con `r#"` e termina con `"#`. Ci consente di inserire |
| 73 | +
|
| 74 | + caratteri che altrimenti potrebbero confondere una stringa normale come letterali (come |
| 75 | + virgolette doppie e barre rovesciate). |
| 76 | + code: >- |
| 77 | + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021 |
| 78 | +- title: Stringhe letterali da file |
| 79 | + content_markdown: > |
| 80 | + Se hai del testo molto grande, considera l'utilizzo della macro `include_str!` per |
| 81 | + includi testo da file locali nel tuo programma: |
| 82 | +
|
| 83 | +
|
| 84 | + "ruggine". |
| 85 | +
|
| 86 | + let ciao_html = include_str!("ciao.html"); |
| 87 | +
|
| 88 | + ``` |
| 89 | +- title: Fetta di corda |
| 90 | + content_markdown: > |
| 91 | + Una porzione di stringa è un riferimento a una sequenza di byte in memoria che deve |
| 92 | + essere sempre valido utf-8. |
| 93 | +
|
| 94 | +
|
| 95 | + Anche una porzione di stringa (una sotto-fetta) di una porzione `str` deve essere utf-8 valida. |
| 96 | +
|
| 97 | +
|
| 98 | + Metodi comuni di `&str`: |
| 99 | +
|
| 100 | + * `len` ottiene la lunghezza della stringa letterale in byte (non il numero di |
| 101 | + caratteri). |
| 102 | +
|
| 103 | + * `starts_with`/`ends_with` per test di base. |
| 104 | +
|
| 105 | + * `is_empty` restituisce vero se la lunghezza è zero. |
| 106 | +
|
| 107 | + * `find` restituisce una `Option<usize>` della prima posizione di del testo. |
| 108 | + code: >- |
| 109 | + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021 |
| 110 | +- title: Caratteri |
| 111 | + content_markdown: > |
| 112 | + Con così tante difficoltà nel lavorare con Unicode, Rust offre un modo per farlo |
| 113 | + recupera una sequenza di byte utf-8 come vettore di caratteri di tipo "char". |
| 114 | +
|
| 115 | +
|
| 116 | + Un "char" è sempre lungo 4 byte (consentendo una ricerca efficiente dei singoli file |
| 117 | + caratteri). |
| 118 | + code: >- |
| 119 | + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021 |
| 120 | +- title: Corda |
| 121 | + content_markdown: > |
| 122 | + Una **String** è una struttura che possiede una sequenza di byte utf-8 nella memoria heap. |
| 123 | +
|
| 124 | +
|
| 125 | + Poiché la sua memoria è nell'heap, può essere estesa, modificata, ecc |
| 126 | + modi in cui i letterali stringa non possono. |
| 127 | +
|
| 128 | +
|
| 129 | + Metodi comuni: |
| 130 | +
|
| 131 | +
|
| 132 | + * `push_str` per aggiungere più byte utf-8 alla fine di una stringa. |
| 133 | +
|
| 134 | + * `replace` per sostituire sequenze di byte utf-8 con altre. |
| 135 | +
|
| 136 | + * `to_lowercase`/`to_uppercase` per le modifiche alle maiuscole. |
| 137 | +
|
| 138 | + * `trim` per tagliare lo spazio |
| 139 | +
|
| 140 | +
|
| 141 | + Quando una String viene eliminata, viene eliminata anche la sua memoria heap. |
| 142 | +
|
| 143 | +
|
| 144 | + `String` ha un operatore `+` che estende la stringa con un `&str` e |
| 145 | + ritorna da solo, ma potrebbe non essere ergonomico come speri. |
| 146 | + code: >- |
| 147 | + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021 |
| 148 | +- title: Testo come parametri di funzione |
| 149 | + content_markdown: > |
| 150 | + Le stringhe letterali e le stringhe vengono generalmente passate come porzioni di stringhe |
| 151 | + funzioni. Questo offre molta flessibilità per |
| 152 | +
|
| 153 | + nella maggior parte degli scenari in cui non è necessario trasferire effettivamente la proprietà. |
| 154 | + code: >- |
| 155 | + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021 |
| 156 | +- title: Costruire stringhe |
| 157 | + content_markdown: | |
| 158 | + "concat" e "join" sono due modi semplici ma potenti per creare stringhe. |
| 159 | + code: >- |
| 160 | + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021 |
| 161 | +- title: Stringhe di formattazione |
| 162 | + content_markdown: > |
| 163 | + La macro `format!` ci consente di creare una stringa definendo un file parametrizzato |
| 164 | + stringa con segnaposto per dove e come posizionare i valori (ad es. |
| 165 | + "{}`). |
| 166 | +
|
| 167 | +
|
| 168 | + `format!` utilizza le stesse stringhe parametrizzate di `println!` |
| 169 | +
|
| 170 | +
|
| 171 | + Le capacità di questa funzione sono troppo ampie per *Tour of Rust*; |
| 172 | + consulta la documentazione [qui](https://doc.rust-lang.org/std/fmt/). |
| 173 | + code: >- |
| 174 | + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021 |
| 175 | +- title: Conversione di stringhe |
| 176 | + content_markdown: | |
| 177 | + Molti tipi possono essere convertiti in una stringa utilizzando "to_string". |
| 178 | +
|
| 179 | + La funzione generica "parse" può essere utilizzata per convertire stringhe |
| 180 | + o valori letterali stringa in un valore tipizzato. Questa funzione ritorna |
| 181 | + un "Risultato" perché potrebbe fallire. |
| 182 | + code: >- |
| 183 | + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021 |
| 184 | +- title: Capitolo 6 - Conclusione |
| 185 | + content_markdown: > |
| 186 | + Ora conosci le basi del testo! Come hai visto, Unicode fa funzionare |
| 187 | + con testo un po' complicato, ma la libreria standard |
| 188 | +
|
| 189 | + ha molte funzionalità per renderlo facile da gestire. |
| 190 | +
|
| 191 | +
|
| 192 | + Finora abbiamo guardato Rust principalmente dalla lente di un procedurale |
| 193 | + paradigma (cioè solo funzioni e dati), |
| 194 | +
|
| 195 | + ma è giunto il momento di parlare dei tratti e delle capacità sbloccate da |
| 196 | + Il paradigma orientato agli oggetti di Rust. |
0 commit comments