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