¿Cómo hacer coincidir una cadena con literales de cadena?
Estoy tratando de descubrir cómo hacer coincidir a String
en Rust.
Inicialmente intenté hacer coincidir así, pero descubrí que Rust no puede transmitir implícitamente desde std::string::String
a &str
.
fn main() {
let stringthing = String::from("c");
match stringthing {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
}
}
Esto tiene el error:
error[E0308]: mismatched types
--> src/main.rs:4:9
|
4 | "a" => println!("0"),
| ^^^ expected struct `std::string::String`, found reference
|
= note: expected type `std::string::String`
found type `&'static str`
Luego intenté construir nuevos String
objetos, ya que no podía encontrar una función para convertir a String
en a &str
.
fn main() {
let stringthing = String::from("c");
match stringthing {
String::from("a") => println!("0"),
String::from("b") => println!("1"),
String::from("c") => println!("2"),
}
}
Esto me dio el siguiente error 3 veces:
error[E0164]: `String::from` does not name a tuple variant or a tuple struct
--> src/main.rs:4:9
|
4 | String::from("a") => return 0,
| ^^^^^^^^^^^^^^^^^ not a tuple variant or struct
¿ Cómo hacer coincidir realmente String
s en Rust?
ACTUALIZACIÓN:
Úselo .as_str()
así para convertir String
a &str
:
match stringthing.as_str() {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
}
Reason
.as_str()
es más conciso y exige una verificación de tipos más estricta. El rasgo as_ref
se implementa para varios tipos y su comportamiento podría cambiarse para el tipo String
, lo que generaría resultados inesperados. De manera similar, si el argumento de entrada cambia de tipo, el compilador no señalará un problema cuando ese tipo implemente el rasgo as_ref
.
Los documentos sugieren utilizar as_str
también https://doc.rust-lang.org/std/string/struct.String.html , https://doc.rust-lang.org/std/primitive.str.html
Antigua respuesta:
as_slice
está en desuso, ahora deberías usar el rasgo std::convert::AsRef
en su lugar:
match stringthing.as_ref() {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
}
Tenga en cuenta que también debe manejar explícitamente el caso general.
Puedes hacer algo como esto:
match &stringthing[..] {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
}
También hay un as_str
método a partir de Rust 1.7.0:
match stringthing.as_str() {
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
}