Jak połączyć następujące kombinacje typów:
str
istr
String
istr
String
iString
string
rust
string-concatenation
jsalter
źródło
źródło
str
i&str
są różne rodzaje i do 99% czasu, tylko powinien dbać o&str
. Są też inne pytania wyszczególniające różnice między nimi.Odpowiedzi:
Podczas łączenia łańcuchów należy przydzielić pamięć, aby zapisać wynik. Najłatwiej jest zacząć
String
a&str
:Tutaj mamy własny ciąg, który możemy mutować. Jest to wydajne, ponieważ potencjalnie pozwala nam ponownie wykorzystać przydział pamięci. Istnieje podobny przypadek
String
iString
, jak&String
można wyrejestrować jako&str
.Po tym
another_owned_string
jest nietknięty (nie mamut
kwalifikatora). Jest jeszcze jeden wariant, który zużywaString
ale nie wymaga to być zmienny. Jest to implementacjaAdd
cechy, która przyjmujeString
jako lewą stronę i&str
jako prawą stronę:Pamiętaj, że
owned_string
nie jest już dostępny po połączeniu z+
.Co jeśli chcielibyśmy wyprodukować nowy ciąg, pozostawiając oba nietknięte? Najprostszym sposobem jest użycie
format!
:Zauważ, że obie zmienne wejściowe są niezmienne, więc wiemy, że nie są dotykane. Jeśli chcielibyśmy zrobić to samo dla dowolnej kombinacji
String
, możemy skorzystać z faktu, żeString
można również sformatować:Nie musisz jednak używać
format!
. Możesz sklonować jeden ciąg i dołączyć drugi do nowego:Uwaga - cała specyfikacja typu, którą zrobiłem, jest zbędna - kompilator może wnioskować o wszystkich typach tutaj odtwarzanych. Dodałem je po prostu, aby były jasne dla osób początkujących w Rust, ponieważ spodziewam się, że to pytanie będzie popularne wśród tej grupy!
źródło
Add
/+
symbol? Możesz to pokryć, jeśli chcesz..to_owned()
i.to_string()
została naprawiona od powyższego komentarza dzięki specjalizacji impl. Oba mają teraz taką samą wydajność, gdy są wywoływane&str
. Odpowiednie zatwierdzanie: github.com/rust-lang/rust/pull/32586/filesAby połączyć wiele ciągów w jeden ciąg oddzielony innym znakiem, istnieje kilka sposobów.
Najmilsze, jakie widziałem, to użycie
join
metody na tablicy:W zależności od przypadku użycia możesz również preferować większą kontrolę:
Widziałem kilka ręcznych sposobów, niektóre unikały jednego lub dwóch przydziałów tu i tam. Dla celów czytelności powyższe dwa są wystarczające.
źródło
join
udokumentowane? Wydaje się, że znajduje się w połowie drogi między tablicą a łańcuchem. Przeszukałem dokumentację tablicy i szybko się pomyliłem.join
jest właściwie przymocowany do tejSliceContactExt
cechy . Cecha jest oznaczona jako niestabilna, ale jej metody są stabilne i są uwzględnione w Preludium, dzięki czemu można je stosować wszędzie domyślnie. Zespół wydaje się być świadomy, że ta cecha nie musi istnieć i myślę, że wraz z nią wszystko się zmieni.Myślę, że tę
concat
metodę+
należy również wymienić:i jest też
concat!
makro, ale tylko dla literałów:źródło
+
jest już wspomniany w istniejącej odpowiedzi . ( Jest to realizacjaAdd
cecha, która trwaString
jako lewej strony a&str
jak po prawej stronie: )Proste sposoby łączenia łańcuchów w RUST
W RUST dostępne są różne metody łączenia łańcuchów
Pierwsza metoda (za pomocą
concat!()
):Dane wyjściowe powyższego kodu to:
Druga metoda (użycie
push_str()
i+
operator):Dane wyjściowe powyższego kodu to:
Trzecia metoda (
Using format!()
):Dane wyjściowe powyższego kodu to:
sprawdź to i eksperymentuj z placem zabaw Rust
źródło