为什么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);
}

为什么不largest拥有向量的第一个元素的所有权?我发现在上一章关于vector的文章中,使用借位语法let largest = &v[0]将获取元素的所有权。为什么此代码通过编译器?

西蒙·怀特黑德

许多原始类型实现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);
}

但是,如果您实现Copy(和Clone),它将运行良好:

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

如果需要,可以在这里的游乐场玩耍

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么索引方法需要所有权?

为什么Rust Closure在被调用之前要拥有所有权

为什么Iterator :: take_while拥有迭代器的所有权?

为什么闭包在这里拥有向量的所有权?

为什么serde_json :: from_reader拥有读者的所有权?

关于 Rust 的所有权

为什么在获得向量的元素所有权后仍然可以使用引用而不访问它?

为什么在 rust 中移动闭包不能移动引用变量的所有权?

为什么Macports拥有大量文件的所有权,我该怎么办?

复制文件*不*拥有所有权

Powershell删除文件夹而不拥有所有权?

拥有所有权时,要更改所有权吗?

需要拥有自我所有权的典型用例是什么?

理解 Rust 中所有权的设计决策

循环中的Rust所有权

拥有所有权的类型属性对于EF Core中的已修改实体不持久

如何在不拥有所有权的情况下获取文件夹的大小?

为什么没有特权的用户不能更改文件所有权?

Grails具有所有权的对象关系-为什么?

对unique_ptr拥有对象的唯一所有权是什么意思?

为什么在转让所有权后可以使用非捕获闭包?

为什么在RPM或DEB软件包中文件所有权很重要?

Docker正在更改文件所有权和权限,为什么?

为什么我在旧的Windows文件夹上失去权限/所有权?

尽管所有权已更改,但按钮的EventListener仍继续触发,为什么?(JavaScript)

为什么ssh-agent组所有权不是root

为什么手动挂载设置了不同的文件所有权?

为什么此所有权转移不会导致错误?

适当的教堂所有权