Supponiamo che sto cercando di eseguire un parser a zero copie in Rust utilizzando &str
, ma a volte ho bisogno di modificare il testo (ad es. Per implementare la sostituzione di variabili). Ho molta voglia di fare qualcosa di simile:Utilizzo di stringhe e stringhe intercambiabili
fn main() {
let mut v: Vec<&str> = "Hello there $world!".split_whitespace().collect();
for t in v.iter_mut() {
if (t.contains("$world")) {
*t = &t.replace("$world", "Earth");
}
}
println!("{:?}", &v);
}
Ma naturalmente il String
restituito da t.replace()
non vivere abbastanza a lungo. C'è un modo carino per aggirare questo? Forse c'è un tipo che significa "idealmente un &str
ma se necessario un String
"? O forse c'è un modo per usare le annotazioni a vita per dire al compilatore che il String
restituito deve essere mantenuto in vita fino alla fine di main()
(o avere la stessa durata di v
)?
Il 'to_mut' qui crea solo un valore' String' non necessario (che implica l'allocazione della memoria heap) che viene immediatamente sovrascritto (comporta deallocation) .Renderei la riga in '* t = Cow :: Owned (t.replace (" $ world "," Earth "));' per evitare questo overhead. – sellibitze
Il tuo ultimo esempio probabilmente dovrebbe avere più avvertimenti al di là di "attenta considerazione" posti attorno ad esso .Sta tratta direttamente la manipolazione basata su byte di stringhe UTF-8 e si basa sul fatto che la sostituzione avviene esattamente lo stesso numero di byte. È sicuramente un'ottimizzazione, ma non uno applicabile universalmente, – Shepmaster
ha aggiunto più avvisi e testo in grassetto. Mi chiedo se un PR aggiunga una funzione 'replace (& mut self, needle, value)' allo Stri la struttura del 'ng sarebbe stata accettata –