首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >参考向量仍然打印为向量?

参考向量仍然打印为向量?
EN

Stack Overflow用户
提问于 2015-04-17 16:58:42
回答 2查看 313关注 0票数 2

愚蠢的n00b试图了解一点关于锈病的知识。这是我的节目:

代码语言:javascript
复制
fn main() {
    let v = vec![1, 2, 3];
    println!("{:?}", v);
    println!("{:?}", &v);
}

产出:

代码语言:javascript
复制
[1, 2, 3]
[1, 2, 3]

&的意义是什么?我还以为它会打印一个记忆地址呢。

我最初是在简介中被抛出的,它看起来像是在循环一个引用。我猜是铁锈做了一些魔术,并检测到它是一个向量的记忆地址?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-17 17:40:35

这句话有什么意义?

正如您所推测的那样,&接受对象的引用。但是,有一个类型只输出引用对象。之所以这样做,是因为锈蚀倾向于更倾向于价值相等,而不是引用相等:

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

如果要打印内存地址,可以使用{:p}

代码语言:javascript
复制
let v = vec![1,2,3];
println!("{:p}", &v);

看起来他们在循环通过一个引用

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

代码语言:javascript
复制
fn into_iter(self) -> slice::Iter<'a, T> {
    self.iter()
}
票数 7
EN

Stack Overflow用户

发布于 2015-04-17 17:29:44

神奇的是格式化程序中的AFAIK,而不是编译器。例如,见:

代码语言:javascript
复制
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);

}

失败时有以下错误:

代码语言:javascript
复制
<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]

&在锈病中有着特殊的意义。它不仅仅是一个引用,它是一个注释,它的值被借用到一个或多个函数/方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29705268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档