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


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.