我通过向量向量的初始化错过了一些东西。 在第一种方法中,我尝试了以下代码:
let mut landFirst: Vec<Vec<char>> = Vec::with_capacity(width);
for v in landFirst {
v.push(Vec::with_capacity(height));
}
但是失败了:
v.push(Vec::with_capacity(height));
^^^^^^^^^^^^^^^^^^^^^^^^^ expected char, found struct `std::vec::Vec`
为什么? v
由Vec<char>
组成,而不是char
。
它与以下代码配合使用:
let mut landFirst: Vec<Vec<char>> = Vec::with_capacity(width);
for cpt in 0..width {
landFirst.insert(cpt, Vec::with_capacity(height));
}
你能启迪我吗?
答案 0 :(得分:4)
首先,您的第一个代码示例将无法达到您的期望,landFirst
仍然为空,即使您使用容量对其进行初始化,它也没有项目,因此永远不会输入for循环。
当您遍历landFirst
的元素时,v
是Vec<char>
,因此您只能向其推送char
,第二个代码示例在以下方面有所不同您要推送到landFirst
,而不是推送到landFirst
中包含的元素。
您的第二个代码示例将正确初始化landFirst
,但是可以将其重写为以下内容:
let mut landFirst = vec![Vec::with_capacity(height); width];
答案 1 :(得分:4)
为什么?
v
由Vec<char>
组成,而不是char
。
让我们检查v
的类型:
for v in land_first {
let () = v;
}
结果是:
error[E0308]: mismatched types
--> src/main.rs:7:13
|
7 | let () = v;
| ^^ expected struct `std::vec::Vec`, found ()
|
= note: expected type `std::vec::Vec<char>`
found type `()`
因此v
的类型为Vec<char>
。为什么?使用for v in land_first
,您可以遍历land_first
的所有元素。 land_first
的元素是什么?正确:Vec<char>
。
您感到困惑的另一件事:Vec::with_capacity()
仅保留内存,而实际上不插入元素。 Vec::with_capacity(10).len()
为0!您需要使用push()
或insert()
来实际插入元素。
这也暗示了您的方法的核心问题:您认为向量中的字符是什么?您从未指定要插入哪个字符。没有明确的默认值总是有用的,对吗?
那么理想情况下,如何初始化向量的向量?有一个有用的vec![]
宏:
const INIT_CHAR: char = '❤';
let land_first = vec![vec![INIT_CHAR; height]; width];
还请注意:
landFirst
更改为land_first
。在Rust中,变量名使用snake_case
。