我试图了解所有权和借款概念。起初我觉得一旦你理解它就很简单了。但...
fn main() {
let a = 5;
let _y = double(a);
println!("{}", a);
}
fn double(x: i32) -> i32 {
x * 2
}
起初我原本以为这不会编译,因为a
会被移到_y
。
我有点困惑,但I found out我会说得对,除了i32
是规则的例外,因为它实现了复制特征。
我查看了the Copy
trait,据我了解,他们列出了在底部实现此特征的所有类型。
所以bool
类型不存在,所以我认为它的默认行为是“移动”。但...
fn main() {
let a = true;
let _y = change_truth(a);
println!("{}", a);
}
fn change_truth(x: bool) -> bool {
!x
}
也不会失败。
现在我很困惑。我发现Clone
trait似乎与复制特征密切相关。但除非我错过了,否则他们在学习文档中并没有真正提及它。
有人可以给我更多信息吗?
更新
答案 0 :(得分:8)
您的理解非常明确,这似乎与文档有关。文档不会显示任何基元类型的Copy
个实例,即使它们肯定是Copy
。作为一个示例,显示编译器将bool
视为Copy
,以下编译就好了:
fn takes_copyable<T: Copy>(foo: T) {}
fn main() {
takes_copyable(true);
}