Rust如何基于lines迭代器优雅构建HashSet并解决collect类型错误
报错原因
str::lines()方法返回的迭代器产出元素类型为&str(原字符串的借用切片),本身不会产生Result类型的结果。你在调用collect时强行指定目标类型为Result<HashSet<_>, _>,迭代器元素和收集目标要求的元素类型不匹配,因此触发报错。- 你给出的可运行循环版本存在笔误:循环变量为
word,插入哈希集合时误用了不存在的变量p,修正为hashset.insert(word.to_string())后逻辑是正确的,且性能没有明显缺陷,只是写法不够简洁。
优雅修复方案
方案1:存储拥有所有权的String(适用大多数场景)
直接在迭代链中把&str转为String,再直接收集到HashSet即可,不需要中间容器也不需要手动循环:
use std::collections::HashSet; let test = "foo\nbar\n"; let hashset: HashSet<String> = test .lines() .map(|s| s.to_string()) .collect();
该写法和手动循环的性能完全一致,Rust的迭代器为零开销抽象。
方案2:存储借用的&str(性能最优,有生命周期约束)
如果你的使用场景中,原字符串test的生命周期可以覆盖整个HashSet的使用周期,那么完全不需要转String,直接收集&str即可,省掉内存拷贝开销:
use std::collections::HashSet; let test = "foo\nbar\n"; let hashset: HashSet<&str> = test.lines().collect();
内容的提问来源于stack exchange,提问作者Rand0mMan
相关产品推荐
相关产品推荐

