为什么在将变量的所有权转移到函数中后我仍然可以使用它?

Why can I still use a variable after transferring ownership of it into a function?

我正在尝试学习 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);
}