< 返回版块

Lazy 发表于 2025-01-14 14:05

Tags:variance,invariant,&'a mut T

求教为什么Rust要规定 &'a mut TT的关系是不变的(invariant),有更详细的相关原理或原因介绍吗。我个人粗浅的理解是&'a mut TT完全可以是协变的,好像也没发现有什么不兼容的问题。目前网上搜了点基本都是对官方结论的复述,问了AI回答牛头不对马嘴。

目前看的官方链接里,也只一笔带过说了我们不能假设&mut &'static str&mut &'b str是兼容的以及我们发现将&mut &'a U视为&mut &'b U的子类型是不合适的,然后得出结论,&mut TT上是不变的。

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

评论区

写评论
作者 Lazy 2025-01-14 15:46

因为之前误解让自己陷入了思维误区和盲区,今天上午突然就冒出了“为什么是invariant”的疑惑,然后就把自己陷进去了,我重读了一遍官方章节都没发现我问题在哪。但是经你一提醒,我才就发现我漏了啥,现在就感觉念头都通达了,心情也舒畅了啊😂😂😂

--
👇
TinusgragLin: > 目前看的官方链接里,也只一笔带过

楼主是不是没看仔细?Variance 这一节开篇的例子就与此有关,例子下面的第二句话就是

This is a classic use-after-free bug!

作者 Lazy 2025-01-14 15:24

啊我今天真是脑子抽抽了,昨天确实看了这个,但是今天再继续看的时候就莫名的把assign脑子里自动脑补内联了, 把例子简化成了hello = &world把自己骗过去了,就以为文章漏了说明......抱歉,感谢提醒!

--
👇
TinusgragLin: > 目前看的官方链接里,也只一笔带过

楼主是不是没看仔细?Variance 这一节开篇的例子就与此有关,例子下面的第二句话就是

This is a classic use-after-free bug!

TinusgragLin 2025-01-14 14:47

目前看的官方链接里,也只一笔带过

楼主是不是没看仔细?Variance 这一节开篇的例子就与此有关,例子下面的第二句话就是

This is a classic use-after-free bug!

1 共 3 条评论, 1 页