2016-11-10 42 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 –

相關問題