求教为什么Rust要规定 &'a mut T
与T
的关系是不变的(invariant),有更详细的相关原理或原因介绍吗。我个人粗浅的理解是。目前网上搜了点基本都是对官方结论的复述,问了AI回答牛头不对马嘴。&'a mut T
与T
完全可以是协变的,好像也没发现有什么不兼容的问题
目前看的官方链接里,也只一笔带过说了我们不能假设&mut &'static str
和&mut &'b str
是兼容的以及我们发现将&mut &'a U
视为&mut &'b U
的子类型是不合适的,然后得出结论,&mut T
在T
上是不变的。
error: lifetime may not live long enough
--> src/main.rs:32:5
|
31 | fn test<'a, 'b: 'a>(a: &'a mut &'static str, mut b: &'a mut &'b str) {
| -- lifetime `'b` defined here
32 | b = a;
| ^^^^^ assignment requires that `'b` must outlive `'static`
|
= note: requirement occurs because of a mutable reference to `&str`
= note: mutable references are invariant over their type parameter
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
感谢大佬提醒,发现是我自己理解有误,没认真思考,实际上官方给的例子已经很直白地解释了我之前的问题,是我自己不够仔细。
Ext Link: https://doc.rust-lang.org/nightly/nomicon/subtyping.html#variance
1
共 3 条评论, 1 页
评论区
写评论因为之前误解让自己陷入了思维误区和盲区,今天上午突然就冒出了“为什么是invariant”的疑惑,然后就把自己陷进去了,我重读了一遍官方章节都没发现我问题在哪。但是经你一提醒,我才就发现我漏了啥,现在就感觉念头都通达了,心情也舒畅了啊😂😂😂
--
👇
TinusgragLin: > 目前看的官方链接里,也只一笔带过
楼主是不是没看仔细?Variance 这一节开篇的例子就与此有关,例子下面的第二句话就是
啊我今天真是脑子抽抽了,昨天确实看了这个,但是今天再继续看的时候就莫名的把assign脑子里自动脑补内联了, 把例子简化成了hello = &world把自己骗过去了,就以为文章漏了说明......抱歉,感谢提醒!
--
👇
TinusgragLin: > 目前看的官方链接里,也只一笔带过
楼主是不是没看仔细?Variance 这一节开篇的例子就与此有关,例子下面的第二句话就是
楼主是不是没看仔细?Variance 这一节开篇的例子就与此有关,例子下面的第二句话就是