我正在尝试编写类似 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
有人可以帮助我了解发生了什么事吗?
“缺少生命周期说明符”意味着在结构定义中,您没有告诉它允许对字符串切片的引用保留多长时间。为了使您的代码安全,它必须至少与结构一样长。
您需要在结构体上定义一个生命周期参数并将其用于字符串切片。
struct Excel<'a> {
columns: HashMap<&'a str, Vec<f64>>
}
这表示字符串切片(
HashMap
键)具有由Excel
结构的用户参数化的一些生命周期。生命周期是 Rust 的关键特性之一。您可以在Rust 文档中阅读有关生命周期的更多信息。
通常定义一个拥有字符串的结构体会更简单。然后你就可以使用
String
。
struct Excel {
columns: HashMap<String, Vec<f64>>
}
对结构体字段的引用应该与结构体本身一样存在。因为我们不希望结构体的引用字段指向无效资源。例如
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!
内访问它