gpt4 book ai didi

generics - 需要澄清关于 `Box` 、 `Vec` 和其他集合的(协)方差的 Rust Nomicon 部分

转载 作者:行者123 更新时间:2023-11-29 07:44:50 27 4
gpt4 key购买 nike

Rust Nomicon 有 an entire section on variance除了关于 Box<T> 的这一小节,我或多或少地理解了这一点和 Vec<T>T 上(共同)变体.

Box and Vec are interesting cases because they're variant, but you can definitely store values in them! This is where Rust gets really clever: it's fine for them to be variant because you can only store values in them via a mutable reference! The mutable reference makes the whole type invariant, and therefore prevents you from smuggling a short-lived type into them.

让我困惑的是下面这行:

it's fine for them to be variant because you can only store values in them via a mutable reference!

我的第一个问题是,我对可变引用的含义有点困惑。它是对 Box 的可变引用吗?/Vec

如果是这样,我只能通过可变引用在其中存储值这一事实如何证明它们的(协)方差?我了解什么是(协)方差以及将其用于 Box<T> 的好处, Vec<T>等等,但我很难看到只能通过可变引用存储值与(协)方差的合理性之间的联系。

另外,当我们初始化一个 Box , 是不是在不涉及可变引用的情况下将值移入框中?这是否与我们只能通过可变引用在其中存储值的说法相矛盾?

最后,这个“可变引用”是在什么情况下借用的?它们是否意味着当您调用修改 Box 的方法时?或 Vec你隐含地接受了一个 &mut self ?那是提到的可变引用吗?


2018 年 5 月 2 日更新:

由于我对这个问题还没有得到满意的答案,我认为 nomicon 的解释确实令人困惑。因此,正如在下面的评论线程中所 promise 的那样,我已经打开了 an issue in the Rust Nomicon repository .您可以在那里跟踪任何更新。

最佳答案

我认为该部分可以通过一些工作使其更清晰。

I'm slightly confused as to what the mutable reference is to. Is it a mutable reference to the Box / Vec?

没有。这意味着,如果您将值存储在现有 Box 中,则必须通过对数据的可变引用来实现,例如使用 Box::borrow_mut().

本节试图传达的主要思想是当有另一个内容引用时,您不能修改 Box 的内容。这是有保证的,因为 Box 拥有它的内容。要更改 Box 的内容,您必须采用新的可变引用来完成。

这意味着——即使您确实用较短生命周期的值覆盖了内容——也没关系,因为没有其他人可以使用旧值。借阅检查员不允许。

这与函数参数不同,因为函数有一个代码块,它实际上可以用它的参数做一些事情。在 BoxVec 的情况下,您必须通过可变地借用它们来取出内容,然后才能对它们执行任何操作。

关于generics - 需要澄清关于 `Box` 、 `Vec` 和其他集合的(协)方差的 Rust Nomicon 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49996627/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com