微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将变量的所有权转让给函数后,为什么仍可以使用变量?

如何解决将变量的所有权转让给函数后,为什么仍可以使用变量?

我正在尝试在Rust中“借用”概念上的内容。 以下是我的代码,但无法获取任何借用错误。据我了解,prime1的所有权已转移,但是我仍然可以在变量上使用print。

fn main() {
    let prime1 = 100;
    all_prime_to(prime1);
    
    println!("{}",prime1);
}


fn prime_checker(num: u32) -> bool {
    let mut counter = 0;
    for x in 1..num {
       if num % x == 0 {
           counter += 1;
       }
    }

    counter < 2
}

// Vec is the same as arraylist in JAVA
fn all_prime_to(num: u32) -> Vec<u32> {
    let capacity = (num/3) as usize;
    let mut vec = Vec::with_capacity(capacity);

    for x in 2..num {
       if prime_checker(x){
           vec.push(x)
       }
    }

    vec
} 

当我使用引用方法来保留prime1的所有权时,它仍然提供相同的输出

解决方法

u32 is Copy,这意味着它被复制而不是移动。

,

在下面的示例中,您可以看到某些基本类型(此处为i32)在通过值传递时被隐式复制。

可以显式克隆其他一些更复杂的类型(此处为String),这可以在按值传递时帮助保留原始值。

当涉及到自己的类型时,您必须决定实现Clone是否有意义,以及为什么不CopyCopy应该是便宜的操作(例如i32),它可以隐式地发生而不会引入太多开销。 另一方面,Clone适用于有意义的类型以获得新的相同值,但是此操作可能会引入合理的开销(例如,动态内存分配),因此显式调用了clone()明确表明这是故意的。

fn consume_i32(arg: i32) {
    println!("consuming {}",arg);
}

fn consume_string(arg: String) {
    println!("consuming {}",arg);
}

fn main() {
    let v0 = 123;
    consume_i32(v0);
    println!("{} still available",v0);
    println!("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    let v1 = String::from("hello");
    consume_string(v1);
    // next line won't compile --> commented out
    // println!("{} still available",v1);
    println!("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    let v2 = String::from("again");
    consume_string(v2.clone());
    println!("{} still available",v2);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。