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