为什么在rust中存在对复制类型的不可变引用?

问题描述 投票:0回答:1

所以我刚开始学习锈病(《书》的前几章),显然是个菜鸟。我完成了所有权基础知识第(4)章,并编写了一些测试程序以确保我理解所有内容。我似乎掌握了基础知识,但我问自己为什么为什么甚至可能对副本类型进行不可变的引用。我将尝试通过示例来解释我的想法。

我以为您可能要存储对副本类型的引用,以便稍后可以检查它的值,而不是复制旧值,但这不能是因为不能更改基础值,因为只要是借来的。最基本的示例是以下代码:

let mut x = 10; // push i32
let x_ref = &x; // push immutable reference to x
// x = 100;        change x which is disallowed since it's borrowed currently
println!("{}", x_ref); // do something with the reference since you want the current value of x

我目前(以我目前的知识)可以想到的唯一原因是它们刚刚存在,因此您可以调用需要引用(例如cmp)的泛型方法。这段代码演示了这一点:

let x = 10;               // push i32
// let ordering = 10.cmp(x); try to compare it but you can't since cmp wants a reference
let ordering = 10.cmp(&x) // this works since it's now a reference

所以,这是您可以为副本类型创建不可变引用的唯一原因吗?

免责声明:我没有看到只需继续阅读本书是有效的答案。但是,我完全理解,如果您说类似是的,您需要为此和这个用例(可选示例),它将在X章中介绍。我希望你明白我的意思:)

编辑:也许值得一提,我是C#程序员,对编程本身并不陌生。

编辑2:我不知道这在技术上是否是this question的副本,但我不完全理解问题和答案,因此我希望有一个更简单的答案,可以由real noob理解。

rust
1个回答
0
投票

不可变的引用自然用于提供对引用数据的访问。例如,您可能已经加载了一个词典,并且有多个线程同时从中读取,每个线程都使用自己的不可变引用。因为引用是不可变的,所以这些线程不会破坏该公共数据。

仅使用可变引用,您不能确定是否需要复制完整副本。复制数据需要时间和空间,而时间和空间总是有限的。性能的主要问题往往是您的数据是否适合CPU缓存。

[我猜您正在考虑将“复制”类型视为与引用本身位于同一空间的类型,即sizeof(type) <= sizeof(type*)。 Rust的Copy特征表示可以安全复制的数据,无论大小如何。这些是正交的概念;例如,在没有调整引用计数的情况下,可能无法安全地复制指针,或者数组可能是可复制的,但占用了GB的内存。

© www.soinside.com 2019 - 2024. All rights reserved.