वैश्विक बाधाएं जो रस्ट में कॉपी या क्लोन काम नहीं करती हैं?


20

कहो कि मेरे पास स्निपेट ( खेल का मैदान ) है

struct A {
    pub val: u32
}

const GLOBAL_A: A = A {val: 2};

fn main() {
    let some_a: A = GLOBAL_A;
    let other_a: A = GLOBAL_A;

    println!("double val = {}", some_a.val + other_a.val);
}

चूंकि Aन तो है Cloneऔर न ही Copy, मुझे लगता है कि मूल्य को GLOBAL_Aस्थानांतरित किया जाएगा। यह एक कास्ट के लिए बहुत मायने नहीं रखता है और जैसा कि दिखाया गया है, वैसे भी दो बार "स्थानांतरित" होने के मामले में ऐसा नहीं हो सकता है।

क्या नियम हैं जो उपरोक्त स्निपेट को विचार करने के लिए काम करने की अनुमति देते Aहैं Cloneऔर न ही Copy?

जवाबों:


21

स्थिरांक हमेशा अंतर्निर्मित होते हैं। आपका उदाहरण मूल रूप से जैसा है

struct A {
    pub val: u32
}

fn main() {
    let some_a: A = A {val: 2};
    let other_a: A = A {val: 2};

    println!("double val = {}", some_a.val + other_a.val);
}

मान दो बार खंगाला जाता है, इसलिए इसे Copyया होने की आवश्यकता नहीं है Clone

दूसरी ओर, staticइनबिल्ट नहीं हैं:

struct A {
    pub val: u32
}

static GLOBAL_A: A = A {val: 2};

fn main() {
    let some_a: A = GLOBAL_A;
}

का परिणाम

error[E0507]: cannot move out of static item `GLOBAL_A`
 --> src/main.rs:8:21
  |
8 |     let some_a: A = GLOBAL_A;
  |                     ^^^^^^^^
  |                     |
  |                     move occurs because `GLOBAL_A` has type `A`, which does not implement the `Copy` trait
  |                     help: consider borrowing here: `&GLOBAL_A`
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.