< 返回版块

ZZG 发表于 2024-04-09 14:48

struct MyBox {
    i: i32,
}

impl MyBox {

    fn get_ref(&mut self) -> Option<&i32> {
        None
    }

    fn try_get_ref(&mut self) -> &i32 {
        if let Some(val) = self.get_ref() {
            return val;
        }
        &mut self.i // cannot borrow `self.i` as mutable more than once at a time

    }
}

具体报错在这里 https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=6c4fa376370bdc0e93c9d09a94ee94e7

请问下要怎么更容易理解报错的原因呢?

评论区

写评论
ankoGo 2024-04-11 21:18

这个没办法,所以map直接提供了enpty_or_insert()之类的方法,就是为了避免这个问题

asuper 2024-04-11 09:10

这样应该是可以了,不够如果get_ref返回的是Some(&self.i)的话,还是不能编译吧,现在的编译器在推导这个生命周期的时候应该就是有缺陷的,TinusgragLin贴的帖子里有说明

--
👇
全称量词是儿子: 这样标注一下,你估计就明白了,只需要让self的可变引用在函数结束后同时结束掉他self的可变借用就行,也符合你的需求

struct MyBox {
    i: i32,
}

impl MyBox {
    fn get_ref<'a,'b>(&'a mut self) -> Option<&'b i32> {
        None
    }

    fn try_get_ref(&mut self) -> &i32 {
        if let Some(val) = self.get_ref() {
            return val;
        }
        &mut self.i
    }
}

ankoGo 2024-04-11 00:38

这样标注一下,你估计就明白了,只需要让self的可变引用在函数结束后同时结束掉他self的可变借用就行,也符合你的需求

struct MyBox {
    i: i32,
}

impl MyBox {
    fn get_ref<'a,'b>(&'a mut self) -> Option<&'b i32> {
        None
    }

    fn try_get_ref(&mut self) -> &i32 {
        if let Some(val) = self.get_ref() {
            return val;
        }
        &mut self.i
    }
}

作者 ZZG 2024-04-10 13:22

学到了,已订阅

--
👇
TinusgragLin: issue 和 rfc 我相信应该是之前遇到过或者就是搜到的吧。能知道这篇文章是因为我关注了 reddit 的 rust 板块,又订了 reddit 的每日邮件推送,所以时不时会看到一些 rust 板块大家都在讨论的热帖。还有一个每周的 rust “新闻周刊” https://this-week-in-rust.org/,它也会挑出一些之前一周值得关注的东西,不过大概是因为这个太“干”了,而 reddit 的每日推送中会夹杂着我关注的游戏社区的推送,这个一周一次的推送我反而会遗漏掉几次[捂脸笑]。

TinusgragLin 2024-04-10 11:47

issue 和 rfc 我相信应该是之前遇到过或者就是搜到的吧。能知道这篇文章是因为我关注了 reddit 的 rust 板块,又订了 reddit 的每日邮件推送,所以时不时会看到一些 rust 板块大家都在讨论的热帖。还有一个每周的 rust “新闻周刊” https://this-week-in-rust.org/,它也会挑出一些之前一周值得关注的东西,不过大概是因为这个太“干”了,而 reddit 的每日推送中会夹杂着我关注的游戏社区的推送,这个一周一次的推送我反而会遗漏掉几次[捂脸笑]。

--
👇
ZZG: 为啥大佬们经常能甩一个官方issue,rfc或者blog出来,是真的会经常没事就翻翻看这些地方吗?

--
👇
TinusgragLin: 我记得之前官方对这个问题有一个 update,不知道 2024 版会不会囊括关于这个的一些成果。

作者 ZZG 2024-04-10 10:12

为啥大佬们经常能甩一个官方issue,rfc或者blog出来,是真的会经常没事就翻翻看这些地方吗?

--
👇
TinusgragLin: 我记得之前官方对这个问题有一个 update,不知道 2024 版会不会囊括关于这个的一些成果。

TinusgragLin 2024-04-09 15:23

我记得之前官方对这个问题有一个 update,不知道 2024 版会不会囊括关于这个的一些成果。

作者 ZZG 2024-04-09 15:03

自己搜到这个,感觉是同一个问题

https://www.reddit.com/r/rust/comments/qi3ye9/why_does_returning_a_value_mess_with_borrows/

使用 rustc -Z polonius 也确实能通过编译,此贴终结~

1 共 8 条评论, 1 页