এই প্রশ্ন চিহ্ন অপারেটর সম্পর্কে কি?


97

আমি এর জন্য ডকুমেন্টেশনFile পড়ছি :

//..
let mut file = File::create("foo.txt")?;
//..

কি ?এই লাইনে? আমি এর আগে মরিচা বইতে দেখে মনে পড়ে না।


নোট যে বর্ণনা? 2018 বইয়ের বইয়ের মধ্যে অন্তর্ভুক্ত করা হয়েছে ডক্টরটস.আলং.এল.আর.ইডিশন
প্যাট্রিক স্টাস

উত্তর:


144

আপনি যেমন খেয়াল করেছেন, মরিচের ব্যতিক্রম নেই ex এতে আতঙ্ক রয়েছে, তবে তাদের কার্যকারিতা সীমাবদ্ধ (তারা কাঠামোগত তথ্য বহন করতে পারে না) এবং ত্রুটি-পরিচালনার জন্য তাদের ব্যবহার নিরুত্সাহিত করা হয় (এগুলি অপরিবর্তনযোগ্য ত্রুটির জন্য বোঝানো হয়)।

মরিচে, ত্রুটি পরিচালনার ব্যবহার Result। একটি সাধারণ উদাহরণ হবে:

fn halves_if_even(i: i32) -> Result<i32, Error> {
    if i % 2 == 0 {
        Ok(i / 2)
    } else {
        Err(/* something */)
    }
}

fn do_the_thing(i: i32) -> Result<i32, Error> {
    let i = match halves_if_even(i) {
        Ok(i) => i,
        Err(e) => return Err(e),
    };

    // use `i`
}

এটি দুর্দান্ত কারণ:

  • কোডটি লেখার সময় আপনি ভুলক্রমে ত্রুটিটি মোকাবেলা করতে ভুলতে পারবেন না,
  • কোড পড়ার সময় আপনি তাত্ক্ষণিকভাবে দেখতে পাবেন যে এখানে ত্রুটি হওয়ার সম্ভাবনা রয়েছে।

এটি আদর্শের চেয়ে কম, তবে এটি খুব ভার্জোজ। এই যেখানে প্রশ্ন চিহ্ন অপারেটর ?আসে।

উপরেরগুলি আবার লিখতে পারেন:

fn do_the_thing(i: i32) -> Result<i32, Error> {
    let i = halves_if_even(i)?;

    // use `i`
}

যা অনেক বেশি সংক্ষিপ্ত।

কি ?এখানে আছে সমতূল্য matchউপরে বিবৃতি। সংক্ষেপে বলতে গেলে: এটা unpacks Resultযদি ঠিক আছে এবং ফেরৎ ত্রুটি যদি না।

এটি একটি বিট জাদু, কিন্তু ত্রুটি পরিচালনা boilerplate, কেটে কিছু জাদু প্রয়োজন, এবং ব্যতিক্রমগুলি অসদৃশ তা অবিলম্বে দৃশ্যমান যা ফাংশন কল বা আউট ত্রুটি পারে আবার নাও পারে হল: ঐ যে সঙ্গে সুশোভিত করা হয় ?

যাদুবিদ্যার একটি উদাহরণ এটি এর জন্যও কাজ করে Option:

// Assume
// fn halves_if_even(i: i32) -> Option<i32>

fn do_the_thing(i: i32) -> Option<i32> {
    let i = halves_if_even(i)?;

    // use `i`
}

এটি (অস্থির) Tryবৈশিষ্ট্য দ্বারা চালিত ।

আরো দেখুন:


4
আপনার উত্তরটি কিছুটা বাড়িয়ে দিতে পারলে ভালো লাগবে, উদাহরণস্বরূপ আলোচনা করুন যে ফাংশনটির রিটার্ন টাইপের সাথে আপনি "মোড়কানোর" চেষ্টা করার ধরণের সাথে অবশ্যই মেলে, যেমন Resultবা Option
শুক্র

@ হ্যালো আমি অনুমান করি যে পুরোপুরি একটি নতুন প্রশ্ন হতে চাই
পল রাজ্জান বার্গ

2

এটি পুনরুদ্ধারযোগ্য ত্রুটির ধরণের ফলাফল <টি, ই> এর জন্য ত্রুটি প্রচারের জন্য। এটি ফলাফলটিকে মোড়কে দেয় এবং আপনাকে অভ্যন্তরীণ মান দেয়।

ত্রুটি কেস পরিচালনা করার পরিবর্তে, আপনি এটিকে কলার কোডে প্রচার করুন এবং কেবলমাত্র ওকে ক্ষেত্রে মোকাবেলা করুন। উপকারটি হ'ল এটি প্রচুর বয়লারপ্লেটকে সরিয়ে ফাংশনটির বাস্তবায়নকে সহজ করে তোলে।


.unwrap()কোন ত্রুটির ক্ষেত্রে কোন আতঙ্কের সাথে সত্যিকারের সাথে বিভ্রান্ত হওয়ার দরকার নেই ।
জর্ডান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.