Минимальное воспроизведение:
fn main() {
use std::collections::HashMap;
use std::iter::FromIterator;
let _ = HashMap::from_iter([("key", "value")].iter());
}
Вы должны перебирать принадлежащие кортежи, а не заимствованные, отсюда и странное сообщение об ошибке:
fn main() {
use std::collections::HashMap;
use std::iter::FromIterator;
let _: HashMap<_, _> = HashMap::from_iter([("key", "value")].iter().cloned());
}
Вы также можете использовать collect
, как сказано в документации FromIterator
:
FromIterator
from_iter
редко вызывается явно и вместо этого используется в методе Iterator
collect
. См. collect
документацию для большего количества примеров.
fn main() {
use std::collections::HashMap;
let _: HashMap<_, _> = [("key", "value")].iter().cloned().collect();
// or
let _: HashMap<_, _> = vec![("key", "value")].into_iter().collect();
}
Обратите внимание, что сообщение об ошибке более понятно при collect
:
error[E0277]: the trait bound `std::collections::HashMap<_, _>: std::iter::FromIterator<&(&str, &str)>` is not satisfied
--> src/main.rs:4:54
|
4 | let _: HashMap<_, _> = [("key", "value")].iter().collect();
| ^^^^^^^ a collection of type `std::collections::HashMap<_, _>` cannot be built from an iterator over elements of type `&(&str, &str)`
|
= help: the trait `std::iter::FromIterator<&(&str, &str)>` is not implemented for `std::collections::HashMap<_, _>`
Последняя строка более полезна: итератор должен выполнять итерации по кортежам, а не по ссылкам на кортежи:
impl<K, V, S> FromIterator<(K, V)> for HashMap<K, V, S>