Получение Vec<X> из &HashSet<X>

Предположим, у меня есть функция do_stuff, которая принимает &HashSet<X> и хочет собрать элементы в Vec<X>, копируя все элементы. Каков канонический способ сделать это? В основном я нашел следующие способы сделать это:

  1. Используя _.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()
    }
    

    Здесь рекомендуется:

  2. Используя _.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()
    }
    

    Здесь рекомендуется:

  3. Используя 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())
    }
    

    Здесь рекомендуется:

У меня есть два вопроса:

  1. В чем принципиальная разница между вышеперечисленными методами?

  2. Каков канонический способ собрать предметы из &HashSet<X> в Vec<X>?

Связанный:

xkcd.com/927
cafce25 03.09.2024 19:07

Этот вопрос вообще не основан на мнениях. Это просто вопрос, какой из вариантов является идиоматическим, а какой идиосинкразическим. Я не могу понять близкую причину.

Smiley1000 03.09.2024 23:22

Каково объективное определение слова «идиоматический»? Ваша идиоматика может быть моей индивидуальностью, и наоборот. Это по своей сути субъективно. Кроме того, один ответ, который вы получили, заканчивается надписью IMO, которая в письменном виде звучит как «по моему мнению», так как вы можете утверждать, что он не основан на мнении?

cafce25 03.09.2024 23:25
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
3
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

_.clone().into_iter().collect()

Этот создает промежуточную копию HashSet. Это не то, что вам нужно, это ненужное распределение и обработка. Эмпирическое правило таково: отдавайте предпочтение .cloned().clone().

Эти двое:

_.iter().cloned().collect()

Vec::from_iter(_.iter().cloned())

эквивалентны. Первый более читабелен, IMO.

Другие вопросы по теме