为什么 Rust 的向量索引语法不取得元素的所有权?

钟泽耿*_*钟泽耿 2 ownership rust

当我阅读关于泛型的 Rust 文档时,我发现了一个关于所有权的奇怪问题。看下面的片段:

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);
}
Run Code Online (Sandbox Code Playgroud)

为什么不largest取得向量第一个元素的所有权?我发现在前面关于向量的章节中,使用借用语法let largest = &v[0]将获得元素的所有权。为什么这段代码能通过编译器?

Sim*_*ead 5

许多原始类型都实现了Copy特征- 这意味着当您将它们绑定到其他变量时,它们会被复制。当值被复制时,不存在所有权问题。

这仅用于演示目的,不太实用......但是如果您将示例更改为使用简单的哑结构,您会发现它不再有效(因为它没有实现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);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果你让它实现Copy(和Clone),它会运行良好:

#[derive(Clone, Copy, Debug, PartialEq)]
struct S;
Run Code Online (Sandbox Code Playgroud)

如果您愿意,您可以在此处的 Playground 中玩它


归档时间:

查看次数:

1398 次

最近记录:

7 年,3 月 前