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

标签 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获得向量第一个元素的所有权?我发现在之前的chapter about vectors ,使用借用语法 let largest = &v[0]将取得该元素的所有权。为什么这段代码能通过编译器?

最佳答案

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

这只是出于演示目的,不太实用......但是如果您将示例更改为使用简单的哑结构,您会发现它不再有效(因为它没有实现复制):

#[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),它将运行良好:

#[derive(Clone, Copy, Debug, PartialEq)]
struct S;

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

关于rust - 为什么向量的 Rust 索引语法不取得元素的所有权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51736646/

相关文章:

windows - 为什么我的规范化路径的前缀是\\?\

generics - 实现拥有和借用的特征

string - 一旦其所有者超出范围,谁是串联字符串的所有者?

rust - 为什么 Rust 允许使用不可变绑定(bind)通过引用字段进行修改?

c++ - Rust 中不止一个运算符重载

module - 我可以将对象公开用于集成测试和/或基准测试吗?

rust - 使用参数调用 libc::c_void-Pointer 作为 Rust 中的函数

vector - 使用不可复制的移动值 [E0382] [E0277]

pointers - 当所属变量不可变时,如何插入析构函数调用 `fn drop(&mut self)` 调用?

rust - 类型推断和借用 vs 所有权转移