如何解决将变量的所有权转让给函数后,为什么仍可以使用变量?
我正在尝试在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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。