为什么在将变量的所有权转移到函数中后我仍然可以使用它?
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
是否有意义以及为什么不实施 Copy
。
Copy
应该是一个廉价的操作(比如 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);
}
我正在尝试学习 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
是否有意义以及为什么不实施 Copy
。
Copy
应该是一个廉价的操作(比如 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);
}