Bir String'i Rust'daki string değişmezleriyle nasıl eşleştirebilirim?


205

Ben StringRust bir a maç nasıl anlamaya çalışıyorum .

Başlangıçta böyle eşleme çalıştım, ama üstü kapalı yayın yapamazsanız Rust anladım std::string::Stringetmek &str.

fn main() {
    let stringthing = String::from("c");
    match stringthing {
        "a" => println!("0"),
        "b" => println!("1"),
        "c" => println!("2"),
    }
}

Bu hata var:

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`

Sonra yeni inşa etmeye çalıştı StringBen döküm için bir işlev bulamadık gibi nesneleri Stringbir etmek &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"),
    }
}

Bu bana aşağıdaki hatayı 3 kez verdi:

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

StringS Rust ile nasıl eşleştirilir ?


stringthing.as_str()muhtemelen tüm cevapların en açık olanıdır; Ben sevmiyorum as_refo hatalar yol açabilir, gereksiz genel, ve gibi aleni değil, çünkü tamamen o belli değil as_ref()bir olacak &str, as_strbasit ve net.
Zorf

@Zorf Haklısın. as_strHenüz mevcut olmadığında cevap kabul edildi . Kabul edilen cevabı değiştirdim ama bu soruyu cevaplayan herkese teşekkür ederim!
Jeroen

Yanıtlar:


82

Bunun gibi bir şey yapabilirsiniz:

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

as_strRust 1.7.0'dan itibaren bir yöntem de var:

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

190

as_sliceartık kullanılmıyorsa, std::convert::AsRefbunun yerine özelliği kullanmalısınız:

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

Ayrıca, tümünü yakalama durumunu da açıkça işlemeniz gerektiğini unutmayın.


3
pas 1.4.0 kullanarak bir trim()işlevi kullanabilirsiniz . Sadece kullanmak as_ref()dizeyle eşleşmiyor.
futtetennista

1
Bence, trim()kaldırılan boşluk nedeniyle maç başarısız oluyor . Bu, ertelemenin kullanıcı girişiyle eşleşmesi için iyidir.
Gerard Sexton

1
Çalışmıyor. Sadece read_line'dan String alırsam _ ile eşleşebilir.
Masked Man

Pasın farklı dizeleri nasıl yönettiği hakkında çok şey bilmiyorum, ancak temel bir örnek üzerinde çalışıyor gibi görünüyor .
tforgione


10

Editörün notu: Bu cevap, 1.0'dan önceki bir Rust sürümüyle ilgilidir ve Rust 1.0'da çalışmaz

Bir dize dilimiyle eşleştirebilirsiniz.

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

kullanmak daha iyi .as_ref()ya da .as_str()her ikisi de sahiplik almadı.
Abrar Khan

1

Deneyebilirsin:

fn main() {
    let stringthing = String::from("c");
    match &*stringthing {
        "a" => println!("0"),
        "b" => println!("1"),
        "c" => println!("2"),
        _ => println!("else")
    }
}

2
Ne &*stringthinganlama geldiğini ve ne yaptığını açıklarsanız cevabınızın yararlılığını artırabilir .
Seth Difley
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.