Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么初始化向量向量(Vec<;Vec<;T>;)时需要T而不是Vec<;T>;?_Rust - Fatal编程技术网

Rust 为什么初始化向量向量(Vec<;Vec<;T>;)时需要T而不是Vec<;T>;?

Rust 为什么初始化向量向量(Vec<;Vec<;T>;)时需要T而不是Vec<;T>;?,rust,Rust,我忽略了向量向量的初始化。 在第一种方法中,我尝试了以下代码: let mut landFirst: Vec<Vec<char>> = Vec::with_capacity(width); for v in landFirst { v.push(Vec::with_capacity(height)); } let mut landFirst: Vec<Vec<char>> = Vec::with_capacity(width); for

我忽略了向量向量的初始化。 在第一种方法中,我尝试了以下代码:

let mut landFirst: Vec<Vec<char>> = Vec::with_capacity(width);
for v in landFirst {
    v.push(Vec::with_capacity(height));
}
let mut landFirst: Vec<Vec<char>> = Vec::with_capacity(width);
for cpt in 0..width {
    landFirst.insert(cpt, Vec::with_capacity(height));
}
为什么?
v
Vec
组成,而不是由
char
组成

它适用于以下代码:

let mut landFirst: Vec<Vec<char>> = Vec::with_capacity(width);
for v in landFirst {
    v.push(Vec::with_capacity(height));
}
let mut landFirst: Vec<Vec<char>> = Vec::with_capacity(width);
for cpt in 0..width {
    landFirst.insert(cpt, Vec::with_capacity(height));
}
让mut landFirst:Vec=Vec::具有_容量(宽度);
对于0..width中的cpt{
着陆点插入(cpt,Vec::带容量(高度));
}

您能告诉我吗?

首先,您的第一个代码示例不会达到您期望的效果,
landFirst
仍然是空的,即使您使用容量初始化它,它也没有项目,因此永远不会进入for循环

当您迭代
landFirst
的元素时,
v
是一个
Vec
,因此您只能将
char
推送到它,第二个代码示例的不同之处在于,您推送到
landFirst
,而不是推送到
landFirst
中包含的元素

您的第二个代码示例将正确初始化
landFirst
,但是可以按照以下方式重写:

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

首先,您的第一个代码示例不会执行您期望的操作,
landFirst
仍然为空,即使您使用容量初始化它,它也没有项目,因此永远不会输入for循环

当您迭代
landFirst
的元素时,
v
是一个
Vec
,因此您只能将
char
推送到它,第二个代码示例的不同之处在于,您推送到
landFirst
,而不是推送到
landFirst
中包含的元素

您的第二个代码示例将正确初始化
landFirst
,但是可以按照以下方式重写:

let mut landFirst = vec![Vec::with_capacity(height); width];
为什么?
v
Vec
组成,而不是由
char
组成

让我们检查
v
的类型:

for v in land_first {
    let () = v;
}
这导致:

错误[E0308]:类型不匹配
-->src/main.rs:7:13
|
7 | let()=v;
|^^应为结构'std::vec::vec',找到()
|
=注意:应为'std::vec::vec'类型`
找到类型“%1”()`
因此
v
的类型为
Vec
。为什么?使用land\u first中的v的
可以迭代
land\u first的所有元素。首先登陆的要素是什么?正确:
Vec

另一件让您困惑的事情是:
Vec::with_capacity()
只保留内存,但实际上并不插入元素<代码>向量::具有容量(10)。len()
为0!您需要使用
push()
insert()
来实际插入元素

这也暗示了您的方法的核心问题:您认为向量中的字符是什么?您从未指定要插入哪个字符。没有明确的默认值总是有用的,对吗


那么,理想情况下,如何初始化向量向量呢?这里有有用的
vec![]
宏:

const INIT_CHAR: char = '❤';
let land_first = vec![vec![INIT_CHAR; height]; width];

另请注意:

  • 我将
    landFirst
    更改为
    land\u first
    。在Rust中,变量名使用
    snake\u case
  • 我删除了显式类型注释:这些注释在Rust中通常是不必要的
为什么?
v
Vec
组成,而不是由
char
组成

让我们检查
v
的类型:

for v in land_first {
    let () = v;
}
这导致:

错误[E0308]:类型不匹配
-->src/main.rs:7:13
|
7 | let()=v;
|^^应为结构'std::vec::vec',找到()
|
=注意:应为'std::vec::vec'类型`
找到类型“%1”()`
因此
v
的类型为
Vec
。为什么?使用land\u first中的v的
可以迭代
land\u first的所有元素。首先登陆的要素是什么?正确:
Vec

另一件让您困惑的事情是:
Vec::with_capacity()
只保留内存,但实际上并不插入元素<代码>向量::具有容量(10)。len()
为0!您需要使用
push()
insert()
来实际插入元素

这也暗示了您的方法的核心问题:您认为向量中的字符是什么?您从未指定要插入哪个字符。没有明确的默认值总是有用的,对吗


那么,理想情况下,如何初始化向量向量呢?这里有有用的
vec![]
宏:

const INIT_CHAR: char = '❤';
let land_first = vec![vec![INIT_CHAR; height]; width];

另请注意:

  • 我将
    landFirst
    更改为
    land\u first
    。在Rust中,变量名使用
    snake\u case
  • 我删除了显式类型注释:这些注释在Rust中通常是不必要的

你指出了这一点:我很困惑!我正在学习这门语言,并与我认识的人交往。我想添加没有“NullPointerException”的元素。但正如你所说,我只保留了记忆,没有添加任何字符。这是有道理的。另外,谢谢你关于snake_案件的说明。(事实上,谢谢你的完整答案。)@Edrae你对什么感到困惑?我不太明白你的评论:/@Edrae没问题!我很高兴能帮上忙。请记住,您可以将一个答案标记为“已接受”,以告诉其他人它对您有帮助。你现在不需要这么做,但在这里,如果答案对你有帮助,你最终会这么做。另外:如果你在生锈的第一步需要更多的帮助,你可以,也许可以得到一些小问题的快速反馈。你指出:我很困惑!我正在学习这门语言,并与我认识的人交往。我想添加没有“NullPointerException”的元素。但正如你所说,我只保留了记忆,没有添加任何字符。这是有道理的。另外,谢谢你关于snake_案件的说明。(事实上,谢谢你的完整答案。)@Edrae你对什么感到困惑?我不太明白你的评论:/@Edrae没问题!我很高兴我