如何解决为什么 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 举报,一经查实,本站将立刻删除。