tutorial lenguaje español rust

español - lenguaje rust



Una concatenación más conveniente con una cadena literal en Rust (2)

Nota: Esta respuesta se refiere a una versión anterior a la versión 1.0 de Rust y las bibliotecas han cambiado desde que se escribió. En particular, append ha desaparecido, reemplazado por + , de hecho. Anteriormente, el operador se vio obligado a tomar &String como su argumento, lo que significa ahora la reutilización de la mutación o la asignación, pero ahora lo toma por valor (es decir, String sin referencias) lo que significa que puede reutilizar la asignación.

Si literalmente (hah) tiene literales de cadena, puede usar el concat! macro, por ejemplo, concat!("Hello, ", "world!") . También puede dividir las cadenas de forma nativa en varias líneas, por ejemplo

let lit = "Hello, / World";

(El / consume todos los espacios en blanco siguientes, incluidos los espacios iniciales en la línea siguiente; omitiendo el / incluirá los datos de cadena "literalmente", con líneas nuevas y espacios iniciales, etc.)

En cualquier caso, + con String es muy ineficiente en situaciones como esta, ya que String + &str descartará la asignación anterior y creará una nueva con el resultado (es decir, no reutilizará la memoria anterior). Si no solo maneja los literales, y está construyendo una cadena de forma progresiva, puede usar append en un estilo de encadenamiento "foo".to_string().append("bar").append("baz") o push_str iterativamente, ` let mut s = "foo" .to_string (); s.push_str ("barra"); s.push_str ("baz") ;.

En el Rust nocturno ya no es posible designar un literal de cadena como String con un carácter "~" .

En C ++, por ejemplo, estoy usando literales definidos por el usuario para concatenar literales de cadenas sin la corteza de mencionar std::string cada vez:

inline std::string operator"" _s (const char* str, size_t size) {return std::string (str, size);} foo ("Hello, "_s + "world!");

¿Existe una característica similar existente o planificada en Rust para hacer que la concatenación literal de cadena sea menos dolorosa que String::from_str ("Hello, ") + "world!" ?


¡Puedes usar el format! macro. Es más legible, más amigable con la traducción, más eficiente y más potente (puede concatenar más que solo cadenas, al igual que el ostringstream C ++). También es completamente seguro para tipos.

format!("Hello, {}", "world!")

También puede usar argumentos con nombre para mejorar la legibilidad.

format!("hello, {who}", who="world")

La sintaxis de formato completo se describe en std :: fmt .

Rust no tiene literales definidos por el usuario. Creo que agregar dicha característica es compatible con versiones anteriores, por lo que tal vez esta característica se agregará después de Rust 1.0.