在结构中存储 &str 时“缺少生命周期说明符”是什么意思?

问题描述 投票:0回答:2

我正在尝试编写类似 Excel 的数据结构:

use std::collections::HashMap;

struct Excel {
    columns: HashMap<&str, Vec<f64>>,
}

fn main() {}

但我收到错误:

error[E0106]: missing lifetime specifier
 --> src/main.rs:4:22
  |
4 |     columns: HashMap<&str, Vec<f64>>,
  |                      ^ expected lifetime parameter

有人可以帮助我了解发生了什么事吗?

rust
2个回答
52
投票

“缺少生命周期说明符”意味着在结构定义中,您没有告诉它允许对字符串切片的引用保留多长时间。为了使您的代码安全,它必须至少与结构一样长。

您需要在结构体上定义一个生命周期参数并将其用于字符串切片。

struct Excel<'a> {
    columns: HashMap<&'a str, Vec<f64>>
}

这表示字符串切片(

HashMap
键)具有由
Excel
结构的用户参数化的一些生命周期。生命周期是 Rust 的关键特性之一。您可以在Rust 文档中阅读有关生命周期的更多信息。

通常定义一个拥有字符串的结构体会更简单。然后你就可以使用

String

struct Excel {
    columns: HashMap<String, Vec<f64>>
}

4
投票

对结构体字段的引用应该与结构体本身一样存在。因为我们不希望结构体的引用字段指向无效资源。例如

struct Person<'a>{
    name:&'a str,
    age:i32,
}
fn main(){
  let first_name="yilmaz";
  let mut person=Person{
    name:&first_name,
    age:32
  };
  {
    let last_name=String::from("bingol");
    // `last_name` does not live long enough
    // borrowed value does not live long enough
    person.name=&last_name;
  }
  // If I remove the print, code will have no issue
  println!("person name is {} and his age is {}",person.name,person.age)
}

println!
中,Person 结构仍然存在,但是
last_name
的生存时间不够长,它的作用域已经在代码块内结束,但我们正在尝试在
pirntln!

内访问它
© www.soinside.com 2019 - 2024. All rights reserved.