মরিচায় স্ট্রিং লিটারেলের বিরুদ্ধে কোনও স্ট্রিং কীভাবে মেলে?


199

আমি জাস্টে কীভাবে ম্যাচ করব তা জানার চেষ্টা করছি 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সহজ এবং পরিষ্কার clear
জোর্ফ

@ জর্ফ আপনি ঠিক বলেছেন উত্তরটি যখন as_strউপস্থিত ছিল না তখন তা গ্রহণ করা হয়েছিল । আমি গৃহীত উত্তর পরিবর্তন করেছি তবে যারা এই প্রশ্নের উত্তর দিয়েছেন তাদের সকলকে ধন্যবাদ!
জেরোইন

উত্তর:


69

আপনি এর মতো কিছু করতে পারেন:

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!"),
}

188

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()ব্যবহারটি স্ট্রিংয়ের সাথে মেলে না।
futtetennista

1
আমি মনে করি হোয়াইটস্পেসের কারণে ম্যাচটি ব্যর্থ trim()। এটি ব্যবহারকারীর ইনপুটটির সাথে মিল রাখতে সম্মত নয়।
জেরার্ড Sexton

1
এটি কাজ করে না। যদি আমি পঠন_লাইন থেকে স্ট্রিং পাই তবে এটি কেবল মেলে _
মুখোশযুক্ত ম্যান

মরিচা কীভাবে বিভিন্ন ধরণের স্ট্রিং পরিচালনা করে সে সম্পর্কে বেশি কিছু জানেন না তবে এটি একটি মৌলিক উদাহরণে কাজ করে বলে মনে হচ্ছে
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অর্থ এবং কি তা ব্যাখ্যা করেন তবে এটি আপনার উত্তরের কার্যকারিতা উন্নত করতে পারে।
শেঠ ডিফ্লি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.