Как мне сделать HashSet из итератора символов?

Я только начинаю изучать Rust и все еще работаю над пониманием его подхода. В частности, я работаю над тем, чтобы выяснить, есть ли у двух строк какие-либо общие символы. В другом языке я мог бы сделать это, создав два набора символов в строках и выполнив пересечение наборов. Пока мне не везет в создании HashSet из символов строки в Rust. Я пробую варианты этого:

let lines: Vec<&str> = text_from_file.lines().collect();
let set1 = HashSet::from(lines[0].chars());

С этим вариантом я получаю сообщение об ошибке «привязка признака std::collections::HashSet<_, _>: std::convert::From<&[u8]> не выполняется». Я еще недостаточно понимаю Rust, чтобы понять, как это интерпретировать. Как я могу создать HashSet из символов в строке?

Обратите внимание, что я получаю другую ошибку, когда я пробую это в Playground: «привязка черты HashSet<_, _>: From<Chars<'_>> не выполняется».

user4815162342 04.12.2022 11:49
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
2
1
602
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы хотите использовать HashSet::from_iter()

let lines: Vec<&str> = text_from_file.lines().collect();
let set1: HashSet<char> = HashSet::from_iter(lines[0].chars());

Есть ли преимущество у HashSet::from_iter(lines[0].chars()) перед lines[0].chars().collect() или они в основном эквивалентны?

SSteve 04.12.2022 03:57

@SSteve Они эквивалентны. collect() в основном звонки from_iter(). collect() лучше в конце (или середине) цепочек методов.

Chayim Friedman 04.12.2022 04:17

HashSet::from() требует среза в качестве параметра, но lines[0].chars() — это объект Chars, который является итератором.

Чтобы создать HashSet из итератора, у вас есть две возможности:

let set1: HashSet<char> = lines[0].chars().collect();
let set1: HashSet<char> = HashSet::from_iter(lines[0].chars());

Я предпочитаю первый, так как мне намного легче читать.

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