愚蠢的n00b试图了解一下Rust。这是我的计划:
fn main() {
let v = vec![1, 2, 3];
println!("{:?}", v);
println!("{:?}", &v);
}
制作输出:
[1, 2, 3]
[1, 2, 3]
&
有什么意义?我有一半期待它打印一个内存地址。
我最初被intro抛出,看起来他们正在循环通过引用。我的猜测是Rust有一些魔法,并且检测到它是向量的内存地址吗?
答案 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中有特殊含义。它不仅仅是一个参考,它是一个值,它借用了一个或多个函数/方法。