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

Bie*_*ela 15 rust

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

use std::collections::HashMap;

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

fn main() {}
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

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

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

evi*_*one 25

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

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

struct Excel<'a> {
    columns: HashMap<&'a str, Vec<f64>>
}
Run Code Online (Sandbox Code Playgroud)

这表示字符串切片(HashMap键)具有由Excel结构的用户参数化的一些生命周期.生命周期是Rust的关键特征之一.您可以在Rust文档中阅读有关生命周期的更多信息.

通常,定义拥有该字符串的结构更简单.然后你可以使用String.

struct Excel {
    columns: HashMap<String, Vec<f64>>
}
Run Code Online (Sandbox Code Playgroud)

  • 这里更保真的说结构需要一个*生命周期参数*(使用泛型),因此对于每个给定的生命周期`'x`和`&'x str`,它可以存储在相应的类型`Excel <'中X>`."与结构相同的生命周期"并不完全是正在发生的事情.一个生命周期参数允许结构描述借用,例如`fn foo <'a>(&'a self) - > Excel <'a>`(Excel结构借用自我,但具体的生命周期由具体生命填补呼叫该方法). (10认同)
  • String 键的建议也很好。这通常是你想要的。 (3认同)