এই সমস্যাটি ইঙ্গিত দেয় যে এটি কেবল একটি বাস্তবায়ন বিশদ ( memcpy
বনাম ???), তবে আমি পার্থক্যের কোনও সুস্পষ্ট বর্ণনা পাই না।
এই সমস্যাটি ইঙ্গিত দেয় যে এটি কেবল একটি বাস্তবায়ন বিশদ ( memcpy
বনাম ???), তবে আমি পার্থক্যের কোনও সুস্পষ্ট বর্ণনা পাই না।
উত্তর:
Clone
যথেচ্ছ অনুলিপি জন্য ডিজাইন করা হয়েছে: একটি Clone
ধরনের জন্য একটি বাস্তবায়ন T
একটি নতুন তৈরি করতে প্রয়োজন নির্বিচারে জটিল অপারেশন করতে পারে T
। এটি একটি সাধারণ বৈশিষ্ট্য (উপস্থাপিত হওয়া ব্যতীত) এবং তাই পদ্ধতি কল ইত্যাদির সাথে একটি সাধারণ বৈশিষ্ট্যের মতো ব্যবহার করা প্রয়োজন
Copy
বৈশিষ্ট্য মান যে নিরাপদে মাধ্যমে সদৃশ হতে পারে প্রতিনিধিত্ব করে memcpy
: reassignments এবং করছে একটি ফাংশন দ্বারা মান একটি আর্গুমেন্ট ক্ষণস্থায়ী সবসময় ভালো জিনিস memcpy
গুলি, এবং তাই জন্য Copy
ধরনের, কম্পাইলার বোঝে যে সেই বিবেচনা করার দরকার নেই একটি পদক্ষেপ ।
Clone
ডিপ-কপি হিসাবে বুঝতে পারি , এবং Copy
ছায়া-অনুলিপি?
Clone
প্রকারটি গভীর বা অগভীর অনুলিপিটি করতে পারে এমন সম্ভাবনাটি খোলে : "নির্বিচারে জটিল"।
মূল পার্থক্য হ'ল ক্লোনিং স্পষ্ট is অন্তর্নিহিত স্বরলিপি মানে একটি নন- Copy
টাইপের জন্য সরানো ।
// u8 implements Copy
let x: u8 = 123;
let y = x;
// x can still be used
println!("x={}, y={}", x, y);
// Vec<u8> implements Clone, but not Copy
let v: Vec<u8> = vec![1, 2, 3];
let w = v.clone();
//let w = v // This would *move* the value, rendering v unusable.
যাইহোক, প্রতিটি Copy
প্রকারেরও হওয়া প্রয়োজন Clone
। তবে, তাদের একই জিনিস করার প্রয়োজন নেই! আপনার নিজের ধরণের জন্য, .clone()
আপনার পছন্দের একটি স্বেচ্ছাসেবী পদ্ধতি হতে পারে, তবে অন্তর্নিহিত অনুলিপি সর্বদা একটি কার্যকর memcpy
করে, clone(&self)
বাস্তবায়ন নয়।
y
একটি স্থানান্তরিত হতে চেয়েছিলেন । আপনি কিভাবে এটি নির্দিষ্ট করবেন? x
w = v
Copy
"সস্তা" প্রকারের জন্য যেমন বাস্তবায়নের জন্য বোঝানো হচ্ছে u8
। আপনি যদি কোনও ভারী ওজনের প্রকার লিখেন, যার জন্য আপনি ভাবেন যে কোনও নকলের চেয়ে কোনও চালচলন আরও কার্যকর, তবে তা প্ররোচিত করবেন নাCopy
। নোট করুন যে u8 ক্ষেত্রে আপনি সম্ভবত একটি চালচালনের সাথে আরও দক্ষ হতে পারবেন না, যেহেতু হুডের নীচে এটি কমপক্ষে একটি পয়েন্টার অনুলিপি লাগবে - যা ইতিমধ্যে u8 অনুলিপি হিসাবে ব্যয়বহুল, তাই কেন বিরক্ত করবেন।
Copy
বৈশিষ্ট্যের উপস্থিতি ভেরিয়েবলগুলির অন্তর্নিহিত আজীবন স্কোপগুলিতে প্রভাব ফেলে? যদি আমি মনে করি এটি লক্ষণীয়।
যেমন ইতিমধ্যে অন্যান্য উত্তর দ্বারা আবৃত:
Copy
অন্তর্নিহিত, সস্তা, এবং পুনরায় প্রয়োগ করা যাবে না (মেমকিপি) cClone
স্পষ্টত, ব্যয়বহুল হতে পারে এবং নির্বিচারে পুনরায় প্রয়োগ করা হতে পারে।Copy
বনামের আলোচনায় মাঝে মধ্যে যা অনুপস্থিত তা হ'ল এটি Clone
কম্পাইলারটি কীভাবে স্বয়ংক্রিয় অনুলিপিগুলি চলগুলি ব্যবহার করে তাও প্রভাবিত করে। এই ক্ষেত্রে:
#[derive(Debug, Clone, Copy)]
pub struct PointCloneAndCopy {
pub x: f64,
}
#[derive(Debug, Clone)]
pub struct PointCloneOnly {
pub x: f64,
}
fn test_copy_and_clone() {
let p1 = PointCloneAndCopy { x: 0. };
let p2 = p1; // because type has `Copy`, it gets copied automatically.
println!("{:?} {:?}", p1, p2);
}
fn test_clone_only() {
let p1 = PointCloneOnly { x: 0. };
let p2 = p1; // because type has no `Copy`, this is a move instead.
println!("{:?} {:?}", p1, p2);
}
প্রথম উদাহরণ ( PointCloneAndCopy
) অন্তর্নিহিত অনুলিপিটির কারণে এখানে দুর্দান্ত কাজ করে তবে দ্বিতীয় উদাহরণ ( PointCloneOnly
) সরানোর পরে কোনও ব্যবহারে ত্রুটি করবে:
error[E0382]: borrow of moved value: `p1`
--> src/lib.rs:20:27
|
18 | let p1 = PointCloneOnly { x: 0. };
| -- move occurs because `p1` has type `PointCloneOnly`, which does not implement the `Copy` trait
19 | let p2 = p1;
| -- value moved here
20 | println!("{:?} {:?}", p1, p2);
| ^^ value borrowed here after move
অন্তর্ভুক্ত পদক্ষেপ এড়ানোর জন্য, আমরা স্পষ্টভাবে কল করতে পারি let p2 = p1.clone();
।
এটি এমন প্রশ্ন উত্থাপন করতে পারে যে কপিরাইট বৈশিষ্ট্য প্রয়োগ করে এমন ধরণের পদক্ষেপকে কীভাবে বাধ্য করা যায়? । সংক্ষিপ্ত উত্তর: আপনি বুঝতে পারবেন না / বোঝাতে পারবেন না।