这是我第一次接触Rust,我正在阅读当前版本的Rust Book中关于向量的章节。我之前有使用其他语言的经验(主要是函数式语言,在那些语言中下面提到的问题被隐藏了)。
运行以下代码片段(来自书中),将返回
运行以下代码片段(来自书中),将返回
3
:fn main() {
let v = vec![1, 2, 3, 4, 5];
let third: &i32 = &v[2];
println!("{}", third);
}
- 我不明白的第一件事是为什么
println!
宏内部的third
没有被引用。我本来期望上面的代码会打印v
的第三个元素的内存地址(就像在C和C++中一样),而不是它的内容。
现在考虑下面的代码(注意这一次在println!
中有引用):
fn main() {
let v = vec![1, 2, 3, 4, 5];
let third: &i32 = &v[2];
println!("{}", *third);
}
- 为什么上面的代码和下面的代码产生完全相同的输出,好像
*
没有起到作用一样?
最后,让我们重写上面的代码片段,完全消除引用:
fn main() {
let v = vec![1, 2, 3, 4, 5];
let third: i32 = v[2];
println!("{}", third);
}
- 为什么这个最新版本的输出结果和前两个版本相同?而
v[2]
的类型到底是&i32
还是i32
?
以上所有问题都是自动解引用(auto-dereferencing)的表现吗?之前的章节只是简单提及了一下它。如果是这样的话,那么这本书需要重写,因为这种描述比解释更加困惑。
()
指定为类型并查看错误消息,例如let third: () = v[2];
。 - starblue