为什么初始化向量的向量(Vec <vec <t >>)期望T而不是Vec <t>?

时间:2018-08-04 12:37:45

标签: rust

我通过向量向量的初始化错过了一些东西。 在第一种方法中,我尝试了以下代码:

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`

为什么? vVec<char>组成,而不是char

它与以下代码配合使用:

let mut landFirst: Vec<Vec<char>> = Vec::with_capacity(width);
for cpt in 0..width {
    landFirst.insert(cpt, Vec::with_capacity(height));
}

你能启迪我吗?

2 个答案:

答案 0 :(得分:4)

首先,您的第一个代码示例将无法达到您的期望,landFirst仍然为空,即使您使用容量对其进行初始化,它也没有项目,因此永远不会输入for循环。

当您遍历landFirst的元素时,vVec<char>,因此您只能向其推送char,第二个代码示例在以下方面有所不同您要推送到landFirst,而不是推送到landFirst中包含的元素。

您的第二个代码示例将正确初始化landFirst,但是可以将其重写为以下内容:

let mut landFirst = vec![Vec::with_capacity(height); width];

答案 1 :(得分:4)

  

为什么? vVec<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
  • 我删除了显式类型注释:Rust中通常不需要这些注释。