Почему я получаю «метод с именем push не найден для типа Option» с вектором векторов? - PullRequest
0 голосов
/ 06 октября 2018

Я пытался использовать вектор 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 голосов
/ 06 октября 2018

Я настоятельно рекомендую прочитать документацию типов и методов, прежде чем использовать их.По крайней мере, посмотрите на функцию подпись .Для slice::get:

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

Хотя здесь происходит несколько обобщений, важная часть заключается в том, что тип возвращаемого значения - Option.Option<Vec> не является Vec.

Обратитесь к главе Rust Programming Language по перечислениям для получения дополнительной информации о перечислениях, включая Option и Result.Если вы хотите продолжить использовать семантику get, вам необходимо:

  1. Переключиться на get_mut, если вы хотите изменить внутренний вектор.
  2. Make example mutable.
  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"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...