json rust

json - El operador r#“”#en Rust



(2)

No puedo encontrar lo que hace

Tiene que ver con literales de cuerdas y cuerdas en bruto. Creo que se explica bastante bien en esta parte de la documentación , en el bloque de código que se publica allí puede ver lo que hace:

"foo"; r"foo"; // foo "/"foo/""; r#""foo""#; // "foo" "foo #/"# bar"; r##"foo #"# bar"##; // foo #"# bar "/x52"; "R"; r"R"; // R "//x52"; r"/x52"; // /x52

Niega la necesidad de escapar de caracteres especiales dentro de la cadena.

Vi al operador r#"" en Rust pero no puedo encontrar lo que hace. Fue útil para crear JSON:

let var1 = "test1"; let json = r#"{"type": "type1", "type2": var1}"#; println!("{}", json) // => {"type2": "type1", "type2": var1}

¿Cuál es el nombre del operador r#"" y cómo hago que var1 evalúe?


El carácter r al comienzo de un literal de cadena denota un literal de cadena sin formato . No es un operador, sino un prefijo.

En un literal de cadena normal, hay algunos caracteres que necesita escapar para que formen parte de la cadena, como " y / . El carácter " debe escaparse porque de lo contrario terminaría la cadena, y el / debe ser Escapó porque es el personaje de escape.

En los literales de cadena sin formato, puede colocar un número arbitrario de símbolos # entre la r y la apertura " . Para cerrar el literal de la cadena sin formato, debe tener un cierre " , seguido por el mismo número de caracteres # que hay al comienzo . Con cero o más # caracteres, puede poner caracteres literales en la cadena (los caracteres no tienen ningún significado especial). Con uno o más # caracteres, puede poner " caracteres literales en la cadena. Si necesita un " seguido de una secuencia de # caracteres en la cadena, solo use el mismo número de # caracteres más uno para delimitar la cadena. Por ejemplo: r##"foo #"# bar"## representa la cadena foo #"# bar . El literal no se detiene en la cita en el medio, porque solo está seguido de una # , mientras que el literal se inició con dos # .

Para responder la última parte de su pregunta, no hay forma de tener un literal de cadena que evalúe las variables en el alcance actual. Algunos lenguajes, como PHP, admiten eso, pero no Rust. Debes considerar usar el format! macro en su lugar. Tenga en cuenta que para JSON, todavía necesitará duplicar las llaves, incluso en un literal de cadena sin formato, porque la cadena interpreta la cadena.

fn main() { let var1 = "test1"; let json = format!(r#"{{"type": "type1", "type2": {}}}"#, var1); println!("{}", json) // => {"type2": "type1", "type2": test1} }

Si necesita generar una gran cantidad de JSON, hay muchas cajas que lo harán más fácil para usted . En particular, con serde_json , puede definir estructuras o enumeraciones de Rust regulares y hacer que se serialicen automáticamente a JSON.