Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';t trust是否允许您使用嵌套可变引用的最内部生存期?_Rust_Borrow Checker_Rust Lifetimes - Fatal编程技术网

为什么';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啊,是的,这现在是有意义的,谢谢。如果你把这些变成一个答案,我会接受的。