为什么布尔值可以复制,即使文档没有表明?

Mat*_*vid 8 rust

我想了解所有权和借贷的概念.起初我觉得一旦你理解它就很简单了.但...

fn main() {
    let a = 5;

    let _y = double(a);
    println!("{}", a);
}

fn double(x: i32) -> i32 {
    x * 2
}
Run Code Online (Sandbox Code Playgroud)

起初我原本以为这不会编译,因为a本来会被移动到_y.

我有点困惑,但我发现我会是正确的,除了这i32是规则的一个例外,因为它实现了复制特征.

我查看了这个Copy特性,据我了解,它们列出了在底部实现此特征的所有类型.

所以bool类型不存在,所以我认为它的默认行为是"移动".但...

fn main() {
    let a = true;

    let _y = change_truth(a);
    println!("{}", a);
}

fn change_truth(x: bool) -> bool {
    !x
}
Run Code Online (Sandbox Code Playgroud)

也不会失败.

现在我很困惑.我发现这个Clone特征似乎与复制特征密切相关.但除非我错过了,否则他们在学习文档中并没有真正提及它.

有人可以给我更多信息吗?

更新:

  1. 在Rust存储库上提交了一个问题.
  2. 我还提出了一些拉动请求,其中包含一些变更建议.

fjh*_*fjh 8

你的理解很明显,这似乎与文档有关.文档没有显示Copy任何基元类型的实例,即使它们是肯定的Copy.作为显示编译器认为bool是的示例Copy,以下编译就好了:

fn takes_copyable<T: Copy>(foo: T) {}

fn main() {
    takes_copyable(true);
}
Run Code Online (Sandbox Code Playgroud)