首页 文章

延长String切片的借用寿命

提问于
浏览
3

我有一个读取文件的函数,并且每行都将它添加到 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 回答

  • 5

    但我无法弄清楚如何告诉借阅检查员增加寿命 .

    不可能 .


    C,C或Rust中值的生命周期定义为:

    • 由其词法范围,如果它绑定到自动变量

    • 由其动态范围,如果它是在堆上分配的

    您可以创建引用此值的变量,如果您的引用长于值,则您有一个悬空引用:

    在C和C中

    • ,你最好不要做任何事情
      在Rust中
    • ,编译器将拒绝编译您的代码

    为了验证您的程序,Rust编译器将要求您注释引用的生命周期;您将在 &'a T 中使用生命周期注释,例如 'a ,它允许命名生命周期以记录多个值的生命周期之间的关系 .

    这里的操作词是 document :一生是无形的,无法受到影响,终身注释 '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
    }
    
  • 3

    reader.lines() 返回拥有的字符串的迭代器 . 但是在你的for循环中,你将这些转换为借用的引用 &str . 因此,当迭代器超出范围时,所有借用的引用都将变为无效 . 考虑使用 HashSet<String> ,这也是零成本,因为字符串得到 moved 进入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
    }
    

相关问题