- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Rust Nomicon 有 an entire section on variance除了关于 Box<T>
的这一小节,我或多或少地理解了这一点和 Vec<T>
在 T
上(共同)变体.
Box
andVec
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
的内容,您必须采用新的可变引用来完成。
这意味着——即使您确实用较短生命周期的值覆盖了内容——也没关系,因为没有其他人可以使用旧值。借阅检查员不允许。
这与函数参数不同,因为函数有一个代码块,它实际上可以用它的参数做一些事情。在 Box
或 Vec
的情况下,您必须通过可变地借用它们来取出内容,然后才能对它们执行任何操作。
关于generics - 需要澄清关于 `Box` 、 `Vec` 和其他集合的(协)方差的 Rust Nomicon 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49996627/
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!