जंग में स्ट्रिंग शाब्दिक के खिलाफ एक स्ट्रिंग का मिलान कैसे करें?


201

मैं यह पता लगाने की कोशिश कर रहा हूं कि Stringरस्ट में मैच कैसे होगा ।

मैंने शुरू में इस तरह से मिलान करने की कोशिश की थी, लेकिन मुझे लगा कि रस्ट का कोई मतलब नहीं std::string::Stringहै &str

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

यह त्रुटि है:

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`

मैंने तब नई Stringवस्तुओं का निर्माण करने की कोशिश की , क्योंकि मैं एक Stringको एक कास्ट करने के लिए फ़ंक्शन नहीं ढूंढ सका &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"),
    }
}

इससे मुझे 3 बार निम्न त्रुटि हुई:

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

वास्तव Stringमें रस्ट में मैच कैसे होता है ?


stringthing.as_str()शायद सभी उत्तरों में से सबसे सीधा है; मुझे यह पसंद नहीं है as_refक्योंकि यह अनावश्यक रूप से सामान्य है, जो बग को जन्म दे सकता है, और स्पष्ट नहीं है, यह पूरी तरह से स्पष्ट नहीं है कि as_ref()यह एक होने जा रहा है &str, as_strसरल और स्पष्ट है।
ज़ोर्फ

@Zorf आप सही हैं। जवाब तब स्वीकार as_strकिया गया जब अभी तक अस्तित्व में नहीं था। मैंने स्वीकार किए गए उत्तर को बदल दिया, लेकिन इस सवाल का जवाब देने वाले सभी लोगों को धन्यवाद!
जीरो

जवाबों:


74

आप ऐसा कुछ कर सकते हैं:

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

as_strरस्ट 1.7.0 के रूप में एक विधि भी है :

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

190

as_sliceपदावनत कर दिया गया है, आपको अब std::convert::AsRefइसके बजाय गुण का उपयोग करना चाहिए :

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

ध्यान दें कि आपको कैच-ऑल केस को स्पष्ट रूप से संभालना होगा।


3
जंग का उपयोग कर 1.4.0 एक trim()समारोह का उपयोग कर सकते हैं । बस उपयोग as_ref()स्ट्रिंग से मेल नहीं खाता है।
भविष्य 17

1
मुझे लगता है कि व्हॉट्सएप के कारण मैच फेल हो जाता है जो trim()हटा देता है। यह उपयोगकर्ता इनपुट के खिलाफ मैच के लिए deferencing के लिए अच्छा है।
गेरार्ड सेक्सटन

1
यह काम नहीं करता है। यह केवल _ से मेल कर सकता है, अगर मुझे read_line से स्ट्रिंग मिलती है।
मैन

विभिन्न प्रकार के स्ट्रिंग्स को जंग कैसे प्रबंधित करता है, इसके बारे में ज्यादा जानकारी नहीं है, लेकिन यह एक मूल उदाहरण पर काम करता है
tforgione


10

संपादक का नोट: यह उत्तर 1.0 से पहले रस्ट के एक संस्करण से संबंधित है और रस्ट 1.0 में काम नहीं करता है

आप एक स्ट्रिंग स्लाइस पर मेल कर सकते हैं।

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

उपयोग करने के लिए बेहतर .as_ref()या .as_str(), दोनों ने स्वामित्व नहीं लिया।
अबरार खान

1

तुम कोशिश कर सकते हो:

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

1
यह आपके उत्तर की उपयोगिता में सुधार कर सकता है यदि आप बताते हैं कि &*stringthingइसका क्या मतलब है और क्या करता है।
सेठ अम्फेली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.