【发布时间】:2019-05-10 05:31:07
【问题描述】:
这是我第一次接触 Rust,我正在阅读当前版本的 Rust Book 中关于向量的章节。我以前确实有其他语言的经验(主要是功能性语言,其中隐藏了以下问题)。
运行以下代码 sn-p(来自书中)返回 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);
}
- 为什么上面的代码产生的输出与上面的完全相同,好像
*没有区别?
最后,让我们重写上面的代码 sn-ps 彻底消除引用:
fn main() {
let v = vec![1, 2, 3, 4, 5];
let third: i32 = v[2];
println!("{}", third);
}
- 为什么最后一个版本产生与前两个相同的输出?
v[2]到底有什么类型:是&i32还是i32?
以上所有内容是否都是在前一章中只提到过一次的自动取消引用的表现? (如果是这样,那么这本书应该重写,因为它比澄清更令人困惑。)
【问题讨论】:
-
如果你想知道类型可以指定
()作为类型并研究错误信息,即let third: () = v[2];。
标签: pointers vector reference rust