我有一个读取文件的函数,并且每行都将它添加到 HashSet
类型为 HashSet
,但我无法弄清楚如何告诉借用检查器增加生命周期 .
到目前为止,这是我的功能:
fn build_collection_set(reader: &mut BufReader<File>) -> HashSet<&str> {
let mut collection_set: HashSet<&str> = HashSet::new();
for line in reader.lines() {
let line = line.unwrap();
if line.len() > 0 {
collection_set.insert(&*line);
}
}
return collection_set;
}
我怎么让Rust知道我想要更长时间保持它?
2 回答
不可能 .
C,C或Rust中值的生命周期定义为:
由其词法范围,如果它绑定到自动变量
由其动态范围,如果它是在堆上分配的
您可以创建引用此值的变量,如果您的引用长于值,则您有一个悬空引用:
在C和C中
在Rust中
为了验证您的程序,Rust编译器将要求您注释引用的生命周期;您将在
&'a T
中使用生命周期注释,例如'a
,它允许命名生命周期以记录多个值的生命周期之间的关系 .这里的操作词是 document :一生是无形的,无法受到影响,终身注释
'a
只是一个允许引用它的名称 .所以?
每当您发现自己想要延长引用的生命周期时,您应该关注的是延长引用的生命周期......或者根本不使用引用而是使用值 .
在这种情况下,一个简单的解决方案是返回
String
而不是&str
:reader.lines()
返回拥有的字符串的迭代器 . 但是在你的for循环中,你将这些转换为借用的引用&str
. 因此,当迭代器超出范围时,所有借用的引用都将变为无效 . 考虑使用HashSet<String>
,这也是零成本,因为字符串得到 moved 进入HashSet,因此不会被复制 .工作实例