对矢量的引用仍打印为矢量?
Reference to a vector still prints as a vector?
愚蠢的 n00b 试图学习一点 Rust。这是我的程序:
fn main() {
let v = vec![1, 2, 3];
println!("{:?}", v);
println!("{:?}", &v);
}
产生了输出:
[1, 2, 3]
[1, 2, 3]
&
有什么意义?我有一半期待它打印一个内存地址。
我最初是在 intro 中被这个问题抛出的,看起来他们正在循环 through 一个参考。我的猜测是 Rust 做了一些魔术并检测到它是一个向量的内存地址?
神奇的是格式化程序中的 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 中有特殊的含义。不仅仅是引用,它是一个注解,值被借给了一个或多个functions/methods。
What is the point of the &?
&
引用了一个对象,正如您猜测的那样。但是,有一个 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);
it looks like they are looping through a reference
for i in foo
语法糖在 foo
上调用 into_iterator
,并且有一个 implementation of IntoIterator
for &Vec
,returns 是对迭代器中项的引用的迭代器:
fn into_iter(self) -> slice::Iter<'a, T> {
self.iter()
}
愚蠢的 n00b 试图学习一点 Rust。这是我的程序:
fn main() {
let v = vec![1, 2, 3];
println!("{:?}", v);
println!("{:?}", &v);
}
产生了输出:
[1, 2, 3]
[1, 2, 3]
&
有什么意义?我有一半期待它打印一个内存地址。
我最初是在 intro 中被这个问题抛出的,看起来他们正在循环 through 一个参考。我的猜测是 Rust 做了一些魔术并检测到它是一个向量的内存地址?
神奇的是格式化程序中的 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 中有特殊的含义。不仅仅是引用,它是一个注解,值被借给了一个或多个functions/methods。
What is the point of the &?
&
引用了一个对象,正如您猜测的那样。但是,有一个 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);
it looks like they are looping through a reference
for i in foo
语法糖在 foo
上调用 into_iterator
,并且有一个 implementation of IntoIterator
for &Vec
,returns 是对迭代器中项的引用的迭代器:
fn into_iter(self) -> slice::Iter<'a, T> {
self.iter()
}