Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 延长字符串切片的借用生存期_Rust - Fatal编程技术网

Rust 延长字符串切片的借用生存期

Rust 延长字符串切片的借用生存期,rust,Rust,我有一个函数,可以读取一个文件,并为每一行将其添加到类型为&str的HashSet,但我不知道如何告诉借阅检查器增加生存期 到目前为止,我的功能如下: fn build_collection_set(reader: &mut BufReader<File>) -> HashSet<&str> { let mut collection_set: HashSet<&str> = HashSet::new(); for

我有一个函数,可以读取一个文件,并为每一行将其添加到类型为
&str
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;
}
fn构建集合集合集合(读取器:&mut BufReader)->HashSet{
让mut collection_set:HashSet=HashSet::new();
对于读卡器中的行。行(){
让line=line.unwrap();
如果line.len()大于0{
集合集合插入(&*行);
}
}
返回集合;
}
如何让Rust知道我想让它保留更长的时间?

reader.lines()
对所拥有的字符串返回迭代器。但在for循环中,您将这些转换为对
&str
的借用引用。因此,当迭代器超出范围时,所有借用的引用都将无效。考虑使用<代码>哈什特集< /Cord>,这也是零成本,因为字符串被“强”>“动/弱”到哈希集中,因此不被复制。

工作示例
fn构建集合集合集合(读取器:&mut BufReader)->HashSet{
让mut collection_set:HashSet=HashSet::new();
对于读卡器中的行。行(){
让line=line.unwrap();
如果line.len()大于0{
集合集合。插入(行);
}
}
集合集合
}
但我不知道如何告诉借书检查人延长使用寿命

这是不可能的


值,在C、C++或锈迹中的生命周期定义为:

  • 根据其词法范围,如果它绑定到自动变量
  • 根据其动态范围,如果它是在堆上分配的
您可以创建引用此值的变量,如果您的引用寿命长于该值,则您有一个悬空引用:

    在C和C++中,最好不要用它< /LI>
  • 在Rust中,编译器将拒绝编译您的代码
为了验证您的程序,Rust编译器将要求您注释引用的生存期;您将在
&'a T
中使用生命周期注释,如
'a
,它允许命名生命周期,以便记录多个值的生命周期之间的关系

这里的关键词是文档:生命是无形的,不能被影响,生命注释
'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
}
fn构建集合集合集合(读取器:&mut BufReader)->HashSet{
让mut collection_set=HashSet::new();
对于读卡器中的行。行(){
让line=line.unwrap();
如果line.len()大于0{
集合集合。插入(行);
}
}
集合集合
}

或的副本。在问新问题之前,请尝试搜索现有问题。我确实搜索过,但没有问题能够告诉我如何延长推荐人的生命周期,这正是我要问的。其中一个答案以“你不能”开头,这与你在这里得到的答案相同:“不可能”那么,我是否应该像这样注释引用:let line:'a String=line.unwrap();让a_参考:&'astr@Cetra:您可以使用
'a:
(标签),但是只能在
的前面,而
用于
循环,在这种情况下,它可以用于从内环直接断开到外环。否则,只能在函数签名中引入生存期名称;正如我所说,大多数时候它们是无形的。
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
}