Comment concaténer des chaînes?
Comment concaténer les combinaisons suivantes de types:
str
etstr
String
etstr
String
etString
- Notez que
str
et&str
sont de types différents, et pour 99% du temps, vous devez être attentif à&str
. Il y a d'autres questions présentant les différences entre eux.
Vous devez vous connecter pour publier un commentaire.
Lorsque vous concaténer des chaînes, vous avez besoin d'allouer de la mémoire pour stocker le résultat. La méthode la plus simple pour commencer est
String
et&str
:Ici, nous avons une propriété de chaîne que l'on peut muter. C'est efficace, car elle permet potentiellement à réutiliser l'allocation de la mémoire. Il y a un cas similaire pour
String
etString
, comme&String
peut être déréférencé comme&str
.Après cela,
another_owned_string
est intacte (note nmut
qualifier). Il y a une autre variante de consomme laString
mais n'en a pas besoin pour être mutables. C'est un la mise en œuvre de laAjouter
trait de caractère qui prend unString
que la gauche et un&str
que le côté droit:Noter que
owned_string
n'est plus accessible suite à l'appel à+
.Que si nous voulions produire une nouvelle chaîne, en laissant intacte? La façon la plus simple est d'utiliser
format!
:Noter que les deux variables d'entrée sont immuables, de sorte que nous savons qu'ils ne sont pas touché. Si nous voulions faire la même chose pour n'importe quelle combinaison de
String
, nous pouvons utiliser le fait queString
peut également être mis en forme:Vous n'avez pas ont à utiliser
format!
bien. Vous pouvez cloner un string et ajouter l'autre de la chaîne de la nouvelle chaîne:Note - ensemble de la spécification du type je ne l'ai est redondant - le compilateur peut déduire tous les types de jouer ici. J'ai ajouté, tout simplement, pour être clair pour les gens nouveaux à la Rouille, comme je m'attends à cette question pour être populaire avec le groupe!
Add
/+
symbole? Vous pourriez couvrir si vous le souhaitez..to_owned()
et.to_string()
a été corrigé depuis le commentaire ci-dessus grâce à impl spécialisation. Ils ont maintenant les mêmes performances lorsqu'il est appelé sur une&str
. Commit: github.com/rust-lang/rust/pull/32586/filesString
et&String
... " comme c'est un edit de moins de 6 caractères ne sera pas me permettre de faire ce changement! (ou peut être plus subtile que je ne l'ai pas compris)String
, mais ensuite, vous prenez une référence à un (&String
) qui peut être contraint à un&str
. J'ai mis le chemin completString
->&String
->&str
parce que les débutants peuvent même ne pas réaliser que vous pouvez prendre une référence à unString
. 🙂Pour concaténer plusieurs chaînes de caractères en une chaîne unique, séparées par un autre personnage, il ya un couple de façons.
Les plus beaux que j'ai vu, c'est à l'aide de la
join
méthode sur un tableau:En fonction de votre utilisation, vous pouvez aussi préférer le plus de contrôle:
Il y a d'autres moyens manuels que j'ai vu, certains d'éviter un ou deux allocations ici et là. Pour des raisons de lisibilité je trouve les deux ci-dessus est suffisante.
join
documenté? Il semble rester à mi-chemin entre un Tableau et une Chaîne. J'ai cherché à travers les array de la documentation et a été rapidement confus.SliceContactExt
trait de caractère. Le trait est marqué instable, mais ses méthodes sont stables et sont inclus dans le Prélude ils sont donc utilisable partout par défaut. L'équipe semble être bien conscient de ce trait de caractère n'a pas besoin d'exister et j'imagine que les choses vont changer à l'avenir avec elle.Je pense que
concat
méthode et+
doit être mentionné ici:et il y a aussi
concat!
macro, mais seulement pour les littéraux: