2015-04-17 80 views
2

愚蠢的n00b試圖學習一些關於鏽。下面是我的程序:對矢量的引用仍然打印爲矢量?

fn main() { 
    let v = vec![1, 2, 3]; 
    println!("{:?}", v); 
    println!("{:?}", &v); 
} 

產生的輸出:

[1, 2, 3] 
[1, 2, 3] 

什麼&點?我有一半期望它打印一個內存地址。

我最初被intro拋出,看起來像是在循環的引用。我的猜測是Rust會發揮一些魔力並檢測到它是一個向量的內存地址?

回答

6

What is the point of the &?

&需要引用一個對象,正如你猜測的那樣。但是,有一個Debug implementation for references to Debug types只打印出引用的對象。這樣做是因爲鏽往往在參考平等偏愛值相等:

impl<'a, T: ?Sized + $tr> $tr for &'a T { 
    fn fmt(&self, f: &mut Formatter) -> Result { $tr::fmt(&**self, f) } 
} 

如果您想打印的內存地址,你可以使用{:p}

let v = vec![1,2,3]; 
println!("{:p}", &v); 

it looks like they are looping through a reference

for i in foo語法sugar在foo上調用into_iterator,並且有一個implementation of IntoIterator for &Vec,它返回迭代器中對項目引用的迭代器:

fn into_iter(self) -> slice::Iter<'a, T> { 
    self.iter() 
} 
+0

謝謝。我讀了迭代器的一節,並看到'for in in&v'給了我作爲v的每個元素的引用。for循環正在做出我想要引用每個可迭代元素的魔法 - 作爲反對試圖遍歷指針。那是對的嗎? – speg

+0

@speg我加了一個關於它的部分。基本上,'爲了我在foo'使用'IntoIterator',並且''Vec '這個特性的一個實現代表'Vec :: iter'。 'Vec :: iter'返回一個迭代器,它產生對向量中每個項目的引用。 – Shepmaster

1

魔法是格式化程序中的AFAIK而不是編譯器。參見例如:

fn take_val<T>(a:Vec<T>) {} 
fn take_ref<T>(b:&Vec<T>) {} 

fn main() { 
    let v = vec![1, 2, 3]; 
    take_val(&v); 
    take_ref(&v); 

} 

與以下錯誤失敗:

<anon>:6:14: 6:16 error: mismatched types: 
expected `collections::vec::Vec<_>`, 
    found `&collections::vec::Vec<_>` 
(expected struct `collections::vec::Vec`, 
    found &-ptr) [E0308] 
<anon>:6  take_val(&v); 

這表明這是由於格式器不想顯示基準和一個值之間的差異。在Rust的舊版本中,&v將顯示爲&[1, 2, 3],如果我的記憶功能正確。

&在Rust中有特殊含義。這不僅僅是一個參考,而是值得借鑑的一個或多個功能/方法。