অনুলিপি এবং ক্লোন মধ্যে পার্থক্য কি?


128

এই সমস্যাটি ইঙ্গিত দেয় যে এটি কেবল একটি বাস্তবায়ন বিশদ ( memcpyবনাম ???), তবে আমি পার্থক্যের কোনও সুস্পষ্ট বর্ণনা পাই না।


মরিচের সোর্স
কোডটির

উত্তর:


115

Cloneযথেচ্ছ অনুলিপি জন্য ডিজাইন করা হয়েছে: একটি Cloneধরনের জন্য একটি বাস্তবায়ন Tএকটি নতুন তৈরি করতে প্রয়োজন নির্বিচারে জটিল অপারেশন করতে পারে T। এটি একটি সাধারণ বৈশিষ্ট্য (উপস্থাপিত হওয়া ব্যতীত) এবং তাই পদ্ধতি কল ইত্যাদির সাথে একটি সাধারণ বৈশিষ্ট্যের মতো ব্যবহার করা প্রয়োজন

Copyবৈশিষ্ট্য মান যে নিরাপদে মাধ্যমে সদৃশ হতে পারে প্রতিনিধিত্ব করে memcpy: reassignments এবং করছে একটি ফাংশন দ্বারা মান একটি আর্গুমেন্ট ক্ষণস্থায়ী সবসময় ভালো জিনিস memcpyগুলি, এবং তাই জন্য Copyধরনের, কম্পাইলার বোঝে যে সেই বিবেচনা করার দরকার নেই একটি পদক্ষেপ


5
আমি কি Cloneডিপ-কপি হিসাবে বুঝতে পারি , এবং Copyছায়া-অনুলিপি?
ডিজেভু

11
Cloneপ্রকারটি গভীর বা অগভীর অনুলিপিটি করতে পারে এমন সম্ভাবনাটি খোলে : "নির্বিচারে জটিল"।
পুলি

85

মূল পার্থক্য হ'ল ক্লোনিং স্পষ্ট 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)বাস্তবায়ন নয়।


1
শান্ত! এটি ক্লোন বৈশিষ্ট্যটি অন্তর্নিহিত অনুলিপি সরবরাহ করে কিনা তা নিয়ে আমার কাছে থাকা একটি গৌণ প্রশ্নটি পরিষ্কার করে। এই প্রশ্নটি পরিণত হয়েছে এবং এইটি আমার ধারণা থেকে বেশি সম্পর্কিত ছিল। ধন্যবাদ!
ব্যবহারকারী 12341234

আপনার প্রথম উদাহরণে, ধরুন আপনি সর্বশেষ মন্তব্য করা উদাহরণের মতো এটির একটি অনুলিপি নয়, yএকটি স্থানান্তরিত হতে চেয়েছিলেন । আপনি কিভাবে এটি নির্দিষ্ট করবেন? xw = v
জনবেকারস

2
আপনি পারবেন না এবং আপনিও পারবেন না, কারণ Copy"সস্তা" প্রকারের জন্য যেমন বাস্তবায়নের জন্য বোঝানো হচ্ছে u8। আপনি যদি কোনও ভারী ওজনের প্রকার লিখেন, যার জন্য আপনি ভাবেন যে কোনও নকলের চেয়ে কোনও চালচলন আরও কার্যকর, তবে তা প্ররোচিত করবেন নাCopy । নোট করুন যে u8 ক্ষেত্রে আপনি সম্ভবত একটি চালচালনের সাথে আরও দক্ষ হতে পারবেন না, যেহেতু হুডের নীচে এটি কমপক্ষে একটি পয়েন্টার অনুলিপি লাগবে - যা ইতিমধ্যে u8 অনুলিপি হিসাবে ব্যয়বহুল, তাই কেন বিরক্ত করবেন।
এমডিপআপ

এর অর্থ কি এই যে Copyবৈশিষ্ট্যের উপস্থিতি ভেরিয়েবলগুলির অন্তর্নিহিত আজীবন স্কোপগুলিতে প্রভাব ফেলে? যদি আমি মনে করি এটি লক্ষণীয়।
ব্রায়ান কেইন

7

যেমন ইতিমধ্যে অন্যান্য উত্তর দ্বারা আবৃত:

  • Copy অন্তর্নিহিত, সস্তা, এবং পুনরায় প্রয়োগ করা যাবে না (মেমকিপি) c
  • Clone স্পষ্টত, ব্যয়বহুল হতে পারে এবং নির্বিচারে পুনরায় প্রয়োগ করা হতে পারে।

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();

এটি এমন প্রশ্ন উত্থাপন করতে পারে যে কপিরাইট বৈশিষ্ট্য প্রয়োগ করে এমন ধরণের পদক্ষেপকে কীভাবে বাধ্য করা যায়? । সংক্ষিপ্ত উত্তর: আপনি বুঝতে পারবেন না / বোঝাতে পারবেন না।


@ শিপমাস্টার আমি এটিকে সরিয়ে দিয়েছি যদিও আমি এটি আরও বেশি পাঠযোগ্য বলে মনে করি কারণ এতে মরিচা সংকলকটির সুন্দর রঙের কোডিং রয়েছে এবং আমি বিশেষভাবে নিশ্চিত করেছিলাম যে সমস্ত সন্ধানের প্রাসঙ্গিক শব্দগুলিও পাঠ্যে অন্তর্ভুক্ত রয়েছে।
bluenote10
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.