¿Cómo concateno las siguientes combinaciones de tipos:
str
ystr
String
ystr
String
yString
string
rust
string-concatenation
jsalter
fuente
fuente
str
y&str
son diferentes tipos y durante el 99% del tiempo, solo debe preocuparse&str
. Hay otras preguntas que detallan las diferencias entre ellos.Respuestas:
Cuando concatena cadenas, necesita asignar memoria para almacenar el resultado. Lo más fácil para empezar es
String
y&str
:Aquí, tenemos una cadena propia que podemos mutar. Esto es eficiente ya que potencialmente nos permite reutilizar la asignación de memoria. Hay un caso similar para
String
yString
, como&String
se puede desreferenciar como&str
.Después de esto,
another_owned_string
no se ha tocado (nota sinmut
calificador). Hay otra variante que consume elString
pero no requiere que sea mutable. Esta es una implementación delAdd
rasgo que toma aString
como el lado izquierdo y a&str
como el lado derecho:Tenga en cuenta que
owned_string
ya no se puede acceder después de la llamada a+
.¿Qué pasaría si quisiéramos producir una nueva cadena, dejando ambas sin tocar? La forma más simple es usar
format!
:Tenga en cuenta que ambas variables de entrada son inmutables, por lo que sabemos que no se tocan. Si quisiéramos hacer lo mismo para cualquier combinación de
String
, podemos usar el hecho de queString
también se puede formatear:Sin embargo, no tienes que usar
format!
. Puede clonar una cadena y agregar la otra cadena a la nueva cadena:Nota : toda la especificación de tipo que hice es redundante: el compilador puede inferir todos los tipos en juego aquí. ¡Los agregué simplemente para que sean claros para las personas nuevas en Rust, ya que espero que esta pregunta sea popular entre ese grupo!
fuente
Add
/+
símbolo? Podrías cubrirlo si quieres..to_owned()
y.to_string()
se ha solucionado desde el comentario anterior gracias a la especialización implícita. Ambos ahora tienen el mismo rendimiento cuando se les llama a&str
. CompromisoPara concatenar múltiples cadenas en una sola cadena, separadas por otro carácter, hay un par de formas.
Lo mejor que he visto es usar el
join
método en una matriz:Dependiendo de su caso de uso, también puede preferir más control:
He visto algunas formas más manuales, algunas evitando una o dos asignaciones aquí y allá. Para propósitos de legibilidad, encuentro que los dos anteriores son suficientes.
fuente
join
documentado? Parece estar a medio camino entre una matriz y una cadena. Busqué en la documentación de la matriz y rápidamente me confundí.join
se une realmente a laSliceContactExt
característica . El rasgo está marcado como inestable, pero sus métodos son estables y están incluidos en el Preludio, por lo que pueden usarse en todas partes de forma predeterminada. El equipo parece ser muy consciente de que este rasgo no necesita existir e imagino que las cosas cambiarán en el futuro con él.Creo que ese
concat
método y+
debería mencionarse aquí también:y también hay
concat!
macro pero solo para literales:fuente
+
ya se menciona en una respuesta existente . ( Esta es una implementación de laAdd
característica que tomaString
como el lado de la mano izquierda y una&str
como el lado derecho: )Formas simples de concatenar cadenas en RUST
Hay varios métodos disponibles en RUST para concatenar cadenas
Primer método (usando
concat!()
):La salida del código anterior es:
Segundo método (usando
push_str()
y+
operador):La salida del código anterior es:
Tercer método (
Using format!()
):La salida del código anterior es:
échale un vistazo y experimenta con Rust Play Ground
fuente