对矢量的引用仍然作为矢量打印?

时间:2015-04-17 16:58:43

标签: pointers rust

愚蠢的n00b试图了解一下Rust。这是我的计划:

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

制作输出:

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

&有什么意义?我有一半期待它打印一个内存地址。

我最初被intro抛出,看起来他们正在循环通过引用。我的猜测是Rust有一些魔法,并且检测到它是向量的内存地址吗?

2 个答案:

答案 0 :(得分:6)

  

&?

有什么意义

正如你猜测的那样,&接受一个对象的引用。但是,只有Debug implementation for references to Debug types打印出引用的对象。之所以这样做是因为Rust倾向于更喜欢值相等而不是引用相等:

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);
  

看起来他们正在循环参考

for i in foo语法糖在into_iterator上调用foo,并且implementation of IntoIterator for &Vec返回迭代器中对项目的引用的迭代器:

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

答案 1 :(得分: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中有特殊含义。它不仅仅是一个参考,它是一个值,它借用了一个或多个函数/方法。