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

时间:2015-05-29 23:11:24

标签: rust

我试图了解所有权和借款概念。起初我觉得一旦你理解它就很简单了。但...

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似乎与复制特征密切相关。但除非我错过了,否则他们在学习文档中并没有真正提及它。

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

更新

  1. 我已提交issue on the Rust repository
  2. 我还提出了pull request一些更改建议。

1 个答案:

答案 0 :(得分:8)

您的理解非常明确,这似乎与文档有关。文档不会显示任何基元类型的Copy个实例,即使它们肯定是Copy。作为一个示例,显示编译器将bool视为Copy,以下编译就好了:

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

fn main() {
    takes_copyable(true);
}