Rust中星号符号的用法是什么?

时间:2016-11-10 16:01:07

标签: rust

我是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;不起作用吗?

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实施的。标准库仅实现向自身添加整数类型(+=)。这意味着您必须添加适当级别的解除引用才能使双方都获得整数。

相关问题