Я только начинаю изучать 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
из символов в строке?
Вы хотите использовать 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 Они эквивалентны. collect()
в основном звонки from_iter()
. collect()
лучше в конце (или середине) цепочек методов.
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());
Я предпочитаю первый, так как мне намного легче читать.
Обратите внимание, что я получаю другую ошибку, когда я пробую это в Playground: «привязка черты
HashSet<_, _>: From<Chars<'_>>
не выполняется».