2016-11-10 1109 views
1

我是新来的锈,我不明白下面的代码:Rust中星号的用法是什么?

let mut x = 5; 
{ 
    let y = &mut x; 
    *y += 1; 
} 
println!("{}", x); 

说明从Rust site

您还会注意到,我们增加了一个星号(*)在y的前面,使其为*y,这是因为y&mut的参考。您还需要使用astrisks [原文]来访问参考内容。

如果*y是一个参考,为什么下面的代码工作

fn main() { 
    let mut x = 5; 
    { 
     let y = &mut x; 
     println!("{}", y); 
    } 
} 

我知道我不是在这里修改的值,但有什么区别,为什么 会y += 1;不行?

+2

可能值得一读:[自动解除引用](http://stackoverflow.com/documentation/rust/2574/auto-dereferencing#t=201611101618367290575)(从本网站的Rust文档部分),它解释了一些在不需要'*'的情况下。 – Aurora0001

回答

3

如果*y是参考

*y的参考。 y是一个参考; *y解除引用y,允许您访问引用的值。

有什么区别[+=println!之间]

println!是一个宏automatically references the arguments given to it。此外,Display trait(通过格式字符串中的{}使用)针对所有对自身实现Displayimpl<'a, T> Display for &'a T where T: Display + ?Sized)的类型的引用实现。

因此,println!("{}", y);实际上是打印出对某个值的引用的引用。由于执行Display,那些中间引用将自动取消引用。另一方面,

+=通过AddAssign trait执行。标准库仅实现向自身添加整数类型(impl AddAssign<i32> for i32)。这意味着你必须添加一个合适的解引用级别才能使双方都成为一个整数。

+0

是否可以为'&mut i32'添加'AddAssign'的实现?这似乎是相当合乎逻辑的,但也许我错过了一个陷阱。 –

+0

@MatthieuM。我相信这是*可能的*,而'添加'特质确实有一些先例。我有一种感觉,有一些很好的理由,但是[RFC在未解决的问题中列出](https://github.com/rust-lang/rfcs/blob/master/text/0953-op-assign.md#unresolved -questions)。你也可能对[this]感兴趣(https://github.com/rust-lang/rust/pull/36380)^ _^ – Shepmaster

+0

啊!甚至没有想过检查报价是否准确:P –

相关问题