为什么布尔值是可复制的,即使文档没有说明?
Why are booleans copyable even though the documentation doesn't indicate that?
我想了解所有权和借用的概念。起初我认为一旦你理解它就很简单。但是...
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
类型不存在,所以我假设它的默认行为是 "moved"。但是...
fn main() {
let a = true;
let _y = change_truth(a);
println!("{}", a);
}
fn change_truth(x: bool) -> bool {
!x
}
也没有失败。
现在我很困惑。我发现 Clone
trait 似乎与复制特征密切相关。但除非我错过了,否则他们并没有在学习文档中真正提到它。
有人可以给我更多信息吗?
更新:
- 我已提交 issue on the Rust repository。
- 我还提出了 pull request 一些更改建议。
你的理解很到位,这似乎是文档的问题。文档没有显示任何基元类型的 Copy
个实例,即使它们肯定是 Copy
。作为显示编译器认为 bool
为 Copy
的示例,以下编译就好了:
fn takes_copyable<T: Copy>(foo: T) {}
fn main() {
takes_copyable(true);
}
我想了解所有权和借用的概念。起初我认为一旦你理解它就很简单。但是...
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
类型不存在,所以我假设它的默认行为是 "moved"。但是...
fn main() {
let a = true;
let _y = change_truth(a);
println!("{}", a);
}
fn change_truth(x: bool) -> bool {
!x
}
也没有失败。
现在我很困惑。我发现 Clone
trait 似乎与复制特征密切相关。但除非我错过了,否则他们并没有在学习文档中真正提到它。
有人可以给我更多信息吗?
更新:
- 我已提交 issue on the Rust repository。
- 我还提出了 pull request 一些更改建议。
你的理解很到位,这似乎是文档的问题。文档没有显示任何基元类型的 Copy
个实例,即使它们肯定是 Copy
。作为显示编译器认为 bool
为 Copy
的示例,以下编译就好了:
fn takes_copyable<T: Copy>(foo: T) {}
fn main() {
takes_copyable(true);
}