¿Cómo hacer coincidir una cadena con literales de cadena?

Resuelto Jeroen asked hace 10 años • 10 respuestas

Estoy tratando de descubrir cómo hacer coincidir a Stringen Rust.

Inicialmente intenté hacer coincidir así, pero descubrí que Rust no puede transmitir implícitamente desde std::string::Stringa &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 Stringobjetos, ya que no podía encontrar una función para convertir a Stringen 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 Strings en Rust?

Jeroen avatar Aug 19 '14 19:08 Jeroen
Aceptado

ACTUALIZACIÓN: Úselo .as_str()así para convertir Stringa &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_refse 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_strtambién https://doc.rust-lang.org/std/string/struct.String.html , https://doc.rust-lang.org/std/primitive.str.html

Antigua respuesta:

as_sliceestá en desuso, ahora deberías usar el rasgo std::convert::AsRefen 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.

Tijs Maas avatar Mar 25 '2015 22:03 Tijs Maas

Puedes hacer algo como esto:

match &stringthing[..] {
    "a" => println!("0"),
    "b" => println!("1"),
    "c" => println!("2"),
    _ => println!("something else!"),
}

También hay un as_strmétodo a partir de Rust 1.7.0:

match stringthing.as_str() {
    "a" => println!("0"),
    "b" => println!("1"),
    "c" => println!("2"),
    _ => println!("something else!"),
}
Anonymous Coward avatar Sep 25 '2015 20:09 Anonymous Coward