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中,编译器将拒绝编译您的代码
&'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
}