Предположим, у меня есть функция do_stuff
, которая принимает &HashSet<X>
и хочет собрать элементы в Vec<X>
, копируя все элементы. Каков канонический способ сделать это? В основном я нашел следующие способы сделать это:
Используя _.clone().into_iter().collect()
(Ссылка GodBolt):
use std::collections::HashSet;
#[derive(Copy, Clone, Eq, Hash, PartialEq)]
struct X {}
struct Y {
xs: HashSet<X>,
}
fn do_stuff(y: &Y) -> Vec<X> {
y.xs.clone().into_iter().collect()
}
Здесь рекомендуется:
Используя _.iter().cloned().collect()
(Ссылка GodBolt):
use std::collections::HashSet;
#[derive(Copy, Clone, Eq, Hash, PartialEq)]
struct X {}
struct Y {
xs: HashSet<X>,
}
fn do_stuff(y: &Y) -> Vec<X> {
y.xs.iter().cloned().collect()
}
Здесь рекомендуется:
Используя Vec::from_iter(_.iter().cloned())
(Ссылка GodBolt):
use std::collections::HashSet;
#[derive(Copy, Clone, Eq, Hash, PartialEq)]
struct X {}
struct Y {
xs: HashSet<X>,
}
fn do_stuff(y: &Y) -> Vec<X> {
Vec::from_iter(y.xs.iter().cloned())
}
Здесь рекомендуется:
У меня есть два вопроса:
В чем принципиальная разница между вышеперечисленными методами?
Каков канонический способ собрать предметы из &HashSet<X>
в Vec<X>
?
Связанный:
Этот вопрос вообще не основан на мнениях. Это просто вопрос, какой из вариантов является идиоматическим, а какой идиосинкразическим. Я не могу понять близкую причину.
Каково объективное определение слова «идиоматический»? Ваша идиоматика может быть моей индивидуальностью, и наоборот. Это по своей сути субъективно. Кроме того, один ответ, который вы получили, заканчивается надписью IMO, которая в письменном виде звучит как «по моему мнению», так как вы можете утверждать, что он не основан на мнении?
_.clone().into_iter().collect()
Этот создает промежуточную копию HashSet
. Это не то, что вам нужно, это ненужное распределение и обработка. Эмпирическое правило таково: отдавайте предпочтение .cloned()
.clone()
.
Эти двое:
_.iter().cloned().collect()
Vec::from_iter(_.iter().cloned())
эквивалентны. Первый более читабелен, IMO.