微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 Rust 不允许您使用嵌套可变引用的最内层生命周期?

如何解决为什么 Rust 不允许您使用嵌套可变引用的最内层生命周期?

我遇到了借用检查器的某些行为,我觉得这很奇怪:如果我有一个 &'a mut &'b mut T where 'b: 'a,T: 'b,似乎我应该能够将它视为一个 { {1}},因为我可以保证我对 &'b mut T 的访问权限至少与 T 一样长。因此,以最简单的形式,(我认为)我应该能够创建这样的函数

'b

然而,借阅检查员不喜欢那样,说

fn f<'a,'b: 'a,T: 'b>(x: &'a mut &'b mut T) -> &'b mut T {
  *x
}

我的主要问题是,为什么?

我的第二个问题是,有没有安全的方法解决这个问题? 我知道我可以将它转换为一个指针,然后将它转换回一个引用,在这个过程中神奇地召唤我想要的任何生命周期,但这需要 error[E0623]: lifetime mismatch --> src/main.rs:6:5 | 5 | fn f<'a,T: 'b>(x: &'a mut &'b mut T) -> &'b mut T { | ----------------- | | | these two types are declared with different lifetimes... 6 | *x | ^^ ...but data from `x` flows into `x` here 代码。我想知道是否有安全的方法可以做到这一点,无论是在一般情况下还是在特定情况下(包括特定 unsafe 代码可以被程序员验证为安全的情况)。

举个例子,我的实际用例是一个迭代器,它返回可变引用,如 unsafe 和迭代器系列;我有一些类似的东西

std::slice::IterMut<'a,T>

问题是在 struct IterMut<'a,T> { source: &'a mut MyContainer<T>,... /* other data for iterating */ } impl<'a,T> Iterator for IterMut<'a,T> { type Item = &'a mut T; fn next(&mut self) -> Option<&'a mut T> { ... } } 方法内部,我只能通过 next 访问 source 引用,有效地创建了一个 &mut self,这限制了我的借用能力从 &mut &'a MyContainer<T>source 的匿名生命周期,这是一个问题。

总而言之,为什么会这样,我可以采取哪些措施来避免这个问题?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。