ধার করা বিষয়বস্তু থেকে সরানো যায় না / ভাগ করা রেফারেন্সের পিছনে যেতে পারে না


127

আমি ত্রুটি বুঝতে পারি না cannot move out of borrowed content। আমি এটি বহুবার পেয়েছি এবং আমি সর্বদা এটি সমাধান করেছি, তবে কেন আমি বুঝতে পারি নি।

উদাহরণ স্বরূপ:

for line in self.xslg_file.iter() {
    self.buffer.clear();

    for current_char in line.into_bytes().iter() {
        self.buffer.push(*current_char as char);
    }

    println!("{}", line);
}

ত্রুটি উত্পাদন করে:

error[E0507]: cannot move out of borrowed content
  --> src/main.rs:31:33
   |
31 |             for current_char in line.into_bytes().iter() {
   |                                 ^^^^ cannot move out of borrowed content

মরিচের নতুন সংস্করণগুলিতে ত্রুটিটি

error[E0507]: cannot move out of `*line` which is behind a shared reference
  --> src/main.rs:31:33
   |
31 |             for current_char in line.into_bytes().iter() {
   |                                 ^^^^ move occurs because `*line` has type `std::string::String`, which does not implement the `Copy` trait

আমি এটি ক্লোন করে সমাধান করেছি line:

for current_char in line.clone().into_bytes().iter() {

অন্য পোস্টগুলি পড়ার পরেও ত্রুটিটি আমি বুঝতে পারি না:

এ জাতীয় ত্রুটির উত্স কী?


1
আপনি কি এই মত প্রশ্ন তাকান ? (বিটিডব্লিউ, স্ট্রিংগুলি .bytes()পদ্ধতিটি সরবরাহ করে ))
হুওন

হ্যাঁ, আমি এটি দেখেছিলাম, তবে বুঝতে পারি নি :( এবং আমার স্ট্রিংটি একটি স্ট্যান্ড :: স্ট্রিং :: স্ট্রিং, ডকুমেন্টেশন অনুসারে, কোনও বাইটস () পদ্ধতি নেই
পিকমো

4
এটি বলা হয়.as_bytes()
ব্লাস করুন

আসলে, আপনাকে ধন্যবাদ, as_bytes()এটি ক্লোনিং ছাড়াই কাজ করে । কিন্তু আমি এখনও বুঝতে পারছি না কেন?
পিকমো

Stringbytesপদ্ধতি থেকে পায় str
হুন ২:27

উত্তর:


108

এর স্বাক্ষরটি দেখুন into_bytes:

fn into_bytes(self) -> Vec<u8>

এটি লাগে self(স্ব &self) এর কোনও রেফারেন্স নয় । এটার মানে হল যে selfকরা হবে না খাওয়া এবং কল পরে উপলব্ধ হবে না। তার জায়গায়, আপনি একটি পাবেন Vec<u8>। উপসর্গটি এ into_জাতীয় নির্দেশকরণ পদ্ধতিগুলির একটি সাধারণ উপায়।

আমি জানি না ঠিক কীভাবে আপনার iter()পদ্ধতিটি প্রত্যাবর্তন করে তবে আমার অনুমান যে এটি একটি পুনরাবৃত্তি সম্পন্ন হয়েছে &String, এটি কোনওটির কাছে রেফারেন্স দেয় Stringতবে আপনাকে সেগুলির মালিকানা দেয় না। এর অর্থ আপনি সেই পদ্ধতিটিকে কল করতে পারবেন না যা মানটি ব্যবহার করে

আপনি যেমন খুঁজে পেয়েছেন, একটি সমাধান হ'ল ব্যবহার করা clone। এটি আপনার নিজের মতো একটি সদৃশ বস্তু তৈরি করে এবং কল করতে পারে into_bytes। অন্যান্য মন্তব্যকারীরা যেমন উল্লেখ করেছেন, আপনি as_bytesযা ব্যবহার করতে পারেন তাও ব্যবহার করতে পারেন &self, সুতরাং এটি bণ নেওয়া মূল্য নিয়ে কাজ করবে। কোনটি আপনার ব্যবহার করা উচিত তা আপনি পয়েন্টারটি দিয়ে কী করবেন তার জন্য আপনার শেষ লক্ষের উপর নির্ভর করে।

বৃহত্তর ছবিতে, এটির মালিকানার ধারণার সাথে সম্পর্কিত । কিছু ক্রিয়াকলাপ আইটেমটির মালিকানার উপর নির্ভর করে এবং অন্যান্য ক্রিয়াকলাপগুলি bণ নিয়ে (সম্ভবত পারস্পরিকভাবে) withণ নিয়ে পালিয়ে যেতে পারে। একটি রেফারেন্স ( &foo) মালিকানা দেয় না, এটি কেবল একটি orrowণ।

কোনও ফাংশনের যুক্তিগুলির selfপরিবর্তে ব্যবহার করা আকর্ষণীয় কেন &self?

মালিকানা স্থানান্তর হ'ল সাধারণভাবে একটি দরকারী ধারণা - যখন আমি কোনও কাজ শেষ করি তখন অন্য কারও কাছে তা থাকতে পারে। মরিচায়, এটি আরও দক্ষ হওয়ার একটি উপায়। আমি একটি অনুলিপি বরাদ্দ করা, আপনাকে একটি অনুলিপি দেওয়া এড়াতে পারি, তারপরে আমার অনুলিপিটি ফেলে দিতে পারি। মালিকানাও সর্বাধিক অনুমোদিত রাষ্ট্র; যদি আমার কোনও অবজেক্টের মালিক হয় তবে এটি আমার ইচ্ছামতো করতে পারি।


এখানে কোডটি যা পরীক্ষার জন্য আমি তৈরি করেছি তা এখানে:

struct IteratorOfStringReference<'a>(&'a String);

impl<'a> Iterator for IteratorOfStringReference<'a> {
    type Item = &'a String;

    fn next(&mut self) -> Option<Self::Item> {
        None
    }
}

struct FileLikeThing {
    string: String,
}

impl FileLikeThing {
    fn iter(&self) -> IteratorOfStringReference {
        IteratorOfStringReference(&self.string)
    }
}

struct Dummy {
    xslg_file: FileLikeThing,
    buffer: String,
}

impl Dummy {
    fn dummy(&mut self) {
        for line in self.xslg_file.iter() {
            self.buffer.clear();

            for current_char in line.into_bytes().iter() {
                self.buffer.push(*current_char as char);
            }

            println!("{}", line);
        }
    }
}

fn main() {}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.