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
Rust 难以管理引用和取消引用的复合 设mut x=1; 设a=&mut x; 设b=&mut*a; *a=2;//错误。b借a *b=3;//它起作用了!(仅不带“*a=2”) 设mut x=1; 让b; { 设a=&mut x; b=&mut*a; }//a滴在这里 *b=2;//它起作用了!_Rust_Reference_Lifetime_Mutable Reference - Fatal编程技术网

Rust 难以管理引用和取消引用的复合 设mut x=1; 设a=&mut x; 设b=&mut*a; *a=2;//错误。b借a *b=3;//它起作用了!(仅不带“*a=2”) 设mut x=1; 让b; { 设a=&mut x; b=&mut*a; }//a滴在这里 *b=2;//它起作用了!

Rust 难以管理引用和取消引用的复合 设mut x=1; 设a=&mut x; 设b=&mut*a; *a=2;//错误。b借a *b=3;//它起作用了!(仅不带“*a=2”) 设mut x=1; 让b; { 设a=&mut x; b=&mut*a; }//a滴在这里 *b=2;//它起作用了!,rust,reference,lifetime,mutable-reference,Rust,Reference,Lifetime,Mutable Reference,我很难理解&*a在生命周期中的含义。 我不知道*运算符与变量的生命周期有什么关系 似乎b借用了x和a,因此不仅x(即*a)不能移动或修改,而且a也不能使用 编译器的错误消息是:b借用a 所以,我运行了第二个代码。 据我所知,借用的数据不能重新分配、移动或删除。 我故意将a放在b之前,以确保a的寿命应长于b 然而,第二个代码仍然有效 那么,我如何理解与&mut*a相关的生命周期呢?重要的误解就在你的第一行代码中。错误不在于b借用a,而是b借用*a,意思是它借用了x。由于Rust会尽早降级和删除引用

我很难理解
&*a
生命周期中的含义。
我不知道
*
运算符与变量的生命周期有什么关系

似乎b借用了x和a,因此不仅x(即*a)不能移动或修改,而且
a
也不能使用

编译器的错误消息是:b借用a

所以,我运行了第二个代码。 据我所知,借用的数据不能重新分配、移动或删除。 我故意将
a
放在
b
之前,以确保
a
的寿命应长于
b

然而,第二个代码仍然有效


那么,我如何理解与
&mut*a
相关的生命周期呢?

重要的误解就在你的第一行代码中。错误不在于
b
借用
a
,而是
b
借用
*a
,意思是它借用了x。由于Rust会尽早降级和删除引用,因此只要您不尝试使用
a
,就可以使用这种“双重”可变引用。但是,当使用
a
时,编译器现在会警告您有一个双重可变引用:变量
a
中有一个借用
*a
(基本上是
x
),变量
b
中有一个借用
*a


清除了这些,您的第二段代码就有意义了
a
可以删除,因为
b
只是使用
*a
借用
x
,而
x
有足够长的生命周期可供访问。

重要的误解在于你的第一行代码。错误不在于
b
借用
a
,而是
b
借用
*a
,意思是它借用了x。由于Rust会尽早降级和删除引用,因此只要您不尝试使用
a
,就可以使用这种“双重”可变引用。但是,当使用
a
时,编译器现在会警告您有一个双重可变引用:变量
a
中有一个借用
*a
(基本上是
x
),变量
b
中有一个借用
*a

let mut x = 1;
let a = &mut x; // now a is the mutable owner of x
let b = &mut *a; // *a -> x so, now b is the mutable owner of x

*a = 2; // it will not work as a is not the current mutable owner of x
*b = 3; // it will work as a is the current mutable owner of x
清除了这些,您的第二段代码就有意义了
a
可以删除,因为
b
只是使用
*a
来借用
x
,并且
x
有足够长的生命周期可以访问

let mut x = 1;
let a = &mut x; // now a is the mutable owner of x
let b = &mut *a; // *a -> x so, now b is the mutable owner of x

*a = 2; // it will not work as a is not the current mutable owner of x
*b = 3; // it will work as a is the current mutable owner of x

如果我更改第一个代码最后两行的顺序,它将正常工作。如果这只是多个可变引用,它就不会这样做。@Kwonryl关键部分是行“Rust降级并尽早删除引用”。当您交换行的顺序时,
b
*b=3
之后不再使用,因此锈掉了它,只留下一个可变引用
a
,允许使用它。(请注意,这只起作用,因为除了能够尽早删除引用之外,如果可能的话,锈蚀还可能在以后改变引用的起始寿命,在本例中就是如此)将
let b=&mut*a
更改为
let b=&mut x
的同一代码会抛出错误。@Kwonryl获得第二个
&mut x
会导致多个可变借用,这当然是不允许的。但是
&mut*a
通过
a
导致
x
的重新箭头,这导致
a
被借用,同时允许
x
通过
b
间接变异。如果我更改第一个代码最后两行的顺序,它将正常工作。如果这只是多个可变引用,它就不会这样做。@Kwonryl关键部分是行“Rust降级并尽早删除引用”。当您交换行的顺序时,
b
*b=3
之后不再使用,因此锈掉了它,只留下一个可变引用
a
,允许使用它。(请注意,这只起作用,因为除了能够尽早删除引用之外,如果可能的话,锈蚀还可能在以后改变引用的起始寿命,在本例中就是如此)将
let b=&mut*a
更改为
let b=&mut x
的同一代码会抛出错误。@Kwonryl获得第二个
&mut x
会导致多个可变借用,这当然是不允许的。然而,
&mut*a
通过
a
导致
x
的重传,这导致
a
被借用,同时允许
x
通过
b
间接变异。这就陷入了我(现在已删除)答案的陷阱,这并不能解释为什么。@Aplet123我已经读了你的答案好几遍了。为什么你认为这不能解释为什么?我想是的。@vallentin不一定是关于代码编译,而是关于如何将
&mut*a
更改为
&mut x
神奇地改变代码的行为并阻止它编译。@Aplet123是的,但我想你的答案解释了这一点。第二个
&mut x
导致多个可变借用。但是,
&mut*a
会导致通过
a
重新出现
x
。这与我(现在已删除)的答案中的陷阱不谋而合,即它没有解释原因,但是。@Aplet123我已经阅读了您的答案好几次。为什么你认为这不能解释为什么?我想是的。@vallentin不一定是关于代码编译,而是关于如何将
&mut*a
更改为
&mut x
神奇地改变代码的行为并阻止它编译。@a