为什么';t trust是否允许您使用嵌套可变引用的最内部生存期?
我遇到了借款检查人的某种行为,我觉得很奇怪:如果我有一个为什么';t trust是否允许您使用嵌套可变引用的最内部生存期?,rust,borrow-checker,rust-lifetimes,Rust,Borrow Checker,Rust Lifetimes,我遇到了借款检查人的某种行为,我觉得很奇怪:如果我有一个&'a mut&'b mut T T,其中'b:'a,T:'b,似乎我应该能够将其视为一个&'b mut,因为我可以保证我对T的可变访问权限至少与'b一样长。所以,以最简单的形式,(我认为)我应该能够做这样一个函数: fn f(x:&'a mut&'b mut)->&'b mut{ *x } 然而,借书人不喜欢这样说 错误[E0623]:生存期不匹配 -->src/main.rs:6:5 | 5 | fn f(x:&a mut&b mut
&'a mut&'b mut T T
,其中'b:'a,T:'b
,似乎我应该能够将其视为一个&'b mut
,因为我可以保证我对T
的可变访问权限至少与'b
一样长。所以,以最简单的形式,(我认为)我应该能够做这样一个函数:
fn f(x:&'a mut&'b mut)->&'b mut{
*x
}
然而,借书人不喜欢这样说
错误[E0623]:生存期不匹配
-->src/main.rs:6:5
|
5 | fn f(x:&a mut&b mut T)->&b mut T{
| -----------------
| |
|这两种类型的声明具有不同的生存期。。。
6 |*x
|^^……但是来自'x'的数据在这里流入'x'
我的主要问题是,为什么
我的第二个问题是,有没有安全的方法来解决这个问题?
我知道我可以将其转换为指针,然后将其转换为引用,在这个过程中神奇地调用我想要的任何生命周期,但这需要不安全的代码。我想知道是否有安全的方法来实现这一点,无论是在一般情况下还是在特定情况下(包括程序员可以验证特定不安全代码是否安全的情况)
例如,我的实际用例是一个迭代器,它返回像std::slice::IterMut这样的可变引用{
资料来源:&'a mut MyContainer,
…/*用于迭代的其他数据*/
}
恳求{
类型项=&'a mut T T;
fn next(&mut self)->Option'b:'a
意味着'b
至少与'a
一样长;也就是说,'a
可能在'b
之前结束。如果返回和'a mut
,则函数签名将有效(即更短的生存期,其中x
保证有效)。你想要的是不合理的,它可以用来获取对同一对象的多个可变引用。既然你使用了迭代器,可能会回答你的问题。@kmdreko啊,是的,这现在是有意义的,谢谢。如果你把这些变成一个答案,我会接受的。