Comment concaténer les combinaisons de types suivantes:
str
etstr
String
etstr
String
etString
string
rust
string-concatenation
jsalter
la source
la source
str
et&str
sont de types différents et pour 99% du temps, vous ne devriez vous en soucier que&str
. Il y a d'autres questions détaillant les différences entre elles.Réponses:
Lorsque vous concaténez des chaînes, vous devez allouer de la mémoire pour stocker le résultat. Le plus simple pour commencer est
String
et&str
:Ici, nous avons une chaîne possédée que nous pouvons muter. Ceci est efficace car cela nous permet potentiellement de réutiliser l'allocation de mémoire. Il existe un cas similaire pour
String
etString
, comme cela&String
peut être déréférencé comme&str
.Après cela,
another_owned_string
n'est pas touché (notez pas demut
qualificatif). Il existe une autre variante qui consomme leString
mais ne nécessite pas qu'il soit modifiable. Il s'agit d'une implémentation duAdd
trait qui prend aString
comme côté gauche et a&str
comme côté droit:Notez que ce
owned_string
n'est plus accessible après l'appel à+
.Et si nous voulions produire une nouvelle chaîne en laissant les deux intactes? Le moyen le plus simple est d'utiliser
format!
:Notez que les deux variables d'entrée sont immuables, nous savons donc qu'elles ne sont pas touchées. Si nous voulions faire la même chose pour n'importe quelle combinaison de
String
, nous pouvons utiliser le fait quiString
peut également être formaté:Vous n'êtes pas obligé de l'utiliser
format!
. Vous pouvez cloner une chaîne et ajouter l'autre chaîne à la nouvelle chaîne:Remarque - toute la spécification de type que j'ai faite est redondante - le compilateur peut déduire tous les types en jeu ici. Je les ai ajoutés simplement pour être clair pour les nouveaux utilisateurs de Rust, car je m'attends à ce que cette question soit populaire auprès de ce groupe!
la source
Add
/+
symbol? Vous pouvez le couvrir si vous le souhaitez..to_owned()
et.to_string()
a été corrigé depuis le commentaire ci-dessus grâce à la spécialisation impl. Ils ont tous deux maintenant les mêmes performances lorsqu'ils sont appelés sur un&str
. Commit pertinent: github.com/rust-lang/rust/pull/32586/filesPour concaténer plusieurs chaînes en une seule chaîne, séparées par un autre caractère, il existe plusieurs méthodes.
Le plus beau que j'ai vu utilise la
join
méthode sur un tableau:En fonction de votre cas d'utilisation, vous pouvez également préférer plus de contrôle:
J'ai vu d'autres méthodes manuelles, certaines évitant une ou deux allocations ici et là. Pour des raisons de lisibilité, je trouve les deux ci-dessus suffisants.
la source
join
documenté? Il semble se situer à mi-chemin entre un tableau et une chaîne. J'ai cherché dans la documentation du tableau et j'ai été rapidement confus.join
est réellement attaché à laSliceContactExt
trait . Le trait est marqué comme instable mais ses méthodes sont stables et sont incluses dans le Prelude donc elles sont utilisables partout par défaut. L'équipe semble bien consciente que ce trait n'a pas besoin d'exister et j'imagine que les choses vont changer à l'avenir avec lui.Je pense que cette
concat
méthode et+
devrait être mentionnée ici aussi:et il y a aussi
concat!
macro mais uniquement pour les littéraux:la source
+
est déjà mentionné dans une réponse existante . ( Ceci est une mise en œuvre duAdd
trait qui prendString
comme côté gauche et&str
que la droite: )Méthodes simples pour concaténer des chaînes dans RUST
Il existe différentes méthodes disponibles dans RUST pour concaténer des chaînes
Première méthode (en utilisant
concat!()
):La sortie du code ci-dessus est:
Deuxième méthode (en utilisant
push_str()
et+
opérateur):La sortie du code ci-dessus est:
Troisième méthode (
Using format!()
):La sortie du code ci-dessus est:
Découvrez-le et expérimentez avec le terrain de jeu Rust
la source