Załóżmy, że próbuję zrobić fantazyjny parser zero-copy w Rust przy użyciu &str
, ale czasami potrzebuję zmodyfikować tekst (na przykład w celu wprowadzenia zastępowania zmiennych). Naprawdę chcę zrobić coś takiego:Używanie str i String w sposób wymierny
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);
}
Ale oczywiście String
zwrócony przez t.replace()
nie żyją wystarczająco długo. Czy jest to dobry sposób? Być może istnieje typ, który oznacza "idealnie &str
, ale w razie potrzeby String
"? A może istnieje sposób na wykorzystanie adnotacji dożywotnich, aby poinformować kompilator, że zwrócony plik String
powinien pozostać przy życiu do końca main()
(lub mieć ten sam czas życia co v
)?
Tutaj 'to_mut' tworzy niepotrzebną wartość' String' (dotyczy alokacji pamięci sterty), która jest natychmiast nadpisywany (wymaga dealokacji).) Zmieniam linię na '* t = krowa :: własność (t.replace (" $ world "," earth "));', aby uniknąć tego narzutu. – sellibitze
Twój ostatni przykład prawdopodobnie Powinien mieć więcej ostrzeżeń poza "starannym rozważaniem" umieszczonym wokół niego, bezpośrednio steruje ciągami UTF-8 bazując na bajtach i opiera się na fakcie, że zamiennik ma dokładnie taką samą liczbę bajtów, to zdecydowanie optymalizacja, ale nie uniwersalne zastosowanie: – Shepmaster
dodano więcej ostrzeżeń i trochę pogrubionego tekstu.Czy zastanawiam się czy PR dodaje funkcję 'replace (& mut self, needle, value)' do 'Stri ng' struct zostanie zaakceptowany –