为什么我得到带有矢量的“没有为Option类型找到名为push的方法”?

时间:2018-10-06 17:15:23

标签: rust

我尝试在另一个向量内使用String向量:

let example: Vec<Vec<String>> = Vec::new();

for _number in 1..10 {
    let mut temp: Vec<String> = Vec::new();
    example.push(temp);
}

我的向量中应该有10个空的String向量,但是:

example.get(0).push(String::from("test"));

失败

error[E0599]: no method named `push` found for type `std::option::Option<&std::vec::Vec<std::string::String>>` in the current scope
 --> src/main.rs:9:20
  |
9 |     example.get(0).push(String::from("test"));
  |                    ^^^^

为什么会失败?甚至有可能有一个向量“起始”?

1 个答案:

答案 0 :(得分:2)

我强烈建议您在使用类型和方法之前阅读它们的文档。至少,请看一下函数的签名。对于slice::get

pub fn get<I>(&self, index: I) -> Option<&<I as SliceIndex<[T]>>::Output>
where
    I: SliceIndex<[T]>,

虽然这里发生了一些泛型,但重要的是返回类型为OptionOption<Vec>不是Vec

请参考The Rust Programming Language's chapter on enums以获得有关枚举的更多信息,包括OptionResult。如果您希望继续使用get的语义,则需要:

  1. 要更改内部向量,请切换到get_mut
  2. 使example可变。
  3. 处理缺少索引值的情况。在这里,我使用if let
let mut example: Vec<_> = std::iter::repeat_with(Vec::new).take(10).collect();

if let Some(v) = example.get_mut(0) {
    v.push(String::from("test"));
}

如果要在索引中不存在该值的情况下终止程序,最短的事情是使用索引语法[]

example[0].push(String::from("test"));