我是Rust的新手,我不理解以下代码:
let mut x = 5;
{
let y = &mut x;
*y += 1;
}
println!("{}", x);
来自Rust site的说明:
您还会注意到我们在
*
前面添加了一个星号(y
),并将其设为*y
,这是因为y
是&mut
1}}参考。您还需要使用astrisks [原文如此]来访问引用的内容。
如果*y
是参考,为什么以下代码有效
fn main() {
let mut x = 5;
{
let y = &mut x;
println!("{}", y);
}
}
我知道我没有在这里修改价值,但有什么区别和原因
会y += 1;
不起作用吗?
答案 0 :(得分:4)
如果
*y
是参考
*y
不是引用。 y
是一个参考; *y
取消引用 y
,允许您访问引用的值。
[{1}}和
之间有何区别?+=
]
println!
是一个automatically references the arguments given to it的宏。此外,Display
trait(在格式字符串中通过println!
使用)是针对自己实现{}
(Display
)的类型的所有引用实现的。
因此,impl<'a, T> Display for &'a T where T: Display + ?Sized
实际上是打印出对值的引用的引用。由于println!("{}", y);
的实现,这些中间引用会自动解除引用。
Display
是通过AddAssign
trait实施的。标准库仅实现向自身添加整数类型(+=
)。这意味着您必须添加适当级别的解除引用才能使双方都获得整数。