собирать значения хэш-карты в вектор - PullRequest
0 голосов
/ 23 июня 2019

Я новичок в Rust и не могу найти способ сбора значений хеш-карты в вектор в документации.

Допустим, у меня есть хеш-карта:

score_table: HashMap<Id, Score>

и я хочу получить все Score в Vec

all_scores: Vec<Score>

Я испытывал желание использовать values, но он не работаетпоскольку значения не являются vec:

all_scores = score_table.values()

Я знаю, что Values реализует черту ExactSizeIterator, но я не знаю, как собрать все значения итератора вvector без ручной записи цикла for и добавления значений в векторе один за другим.

[edit 1]

Я также пытался use std::iter::FromIterator;, но приземлился в что-то вроде:

all_scores = Vec::from_iter(score_table.values());
expected type `std::vec::Vec<Score>`
   found type `std::vec::Vec<&Score>`

[править 2]

благодаря этому вопросу , я изменил его на:

all_scores = Vec::from_iter(score_table.values().cloned());

и он не выдает ошибокна cargo check.

Это хороший способ сделать это?

1 Ответ

2 голосов
/ 23 июня 2019

Метод Iterator.collect предназначен для этой конкретной задачи. Вы правы в том, что вам нужно .cloned(), если вам нужен вектор фактических значений вместо ссылок (если только хранимый тип не реализует Copy, как примитивы), поэтому код выглядит следующим образом:

all_scores = score_table.values().cloned().collect();

Внутренне, collect() просто использует FromIterator, но также выводит тип вывода. Иногда для вывода типа недостаточно информации, поэтому вам может понадобиться явно указать нужный тип, например:

all_scores = score_table.values().cloned().collect::<Vec<Score>>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...