为什么Rust的矢量索引语法不拥有元素的所有权?

时间:2018-08-07 23:13:18

标签: rust ownership

当我阅读Rust documentation on generics时,发现了一个关于所有权的奇怪问题。看下面的代码片段:

fn main() {
    let number_list = vec![34, 50, 25, 100, 65];

    let mut largest = number_list[0];

    for number in number_list {
        if number > largest {
            largest = number;
        }
    }
    println!("The largest number is {}", largest);
}

为什么largest不拥有vector的第一个元素的所有权?我发现在先前的chapter about vectors中,使用借位语法let largest = &v[0]将拥有元素的所有权。为什么这段代码会通过编译器?

1 个答案:

答案 0 :(得分:3)

很多基本类型都实现the Copy trait-这意味着当您将它们绑定到其他变量时,它们会被复制。复制值时没有所有权问题。

这只是出于演示目的,不是很实用...但是,如果您将示例更改为使用简单的哑结构,则会发现它不再起作用(因为它没有实现{{1} }):

Copy

但是,如果您实现了#[derive(Debug, PartialEq)] struct S; fn main() { let number_list = vec![S, S, S, S]; let mut largest = number_list[0]; for number in number_list { if number == largest { largest = number; } } println!("The largest number is {:?}", largest); } (和Copy),它将运行良好:

Clone

You can play with it in the Playground here if you want