在下面的代码中,我不明白为什么 Span需要 life。由于所有参数都实现了复制特征,我的理解是 Span 拥有所有必需的变量。
use ratatui::{
style::{Color, Style},
text::Span,
};
/// Take a u8, and render a colorized ascii, or placeholdler
fn render_ascii_char(val: u8) -> Span {
match val {
val if val > 0x20 && val < 0x7f => {
Span::styled(
val.to_string(),
Style::default().fg(Color::LightCyan)
)
},
_ => {
Span::styled(
"•",
Style::default().fg(Color::Yellow)
)
}
}
}
fn test_function() -> Span {
let val = 0x42;
render_ascii_char(val)
}
fn main() {
let _my_span = test_function();
}
这段代码使用ratatui
.波纹管Cargo.toml
:
[package]
name = "span_lifetime"
version = "0.1.0"
edition = "2024"
[dependencies]
crossterm = "0.27.0"
ratatui = "0.26.2"
编译时出现以下错误消息cargo build
:
$ cargo build
Compiling span_lifetime v0.1.0 (/tmp/playground/span_lifetime)
error[E0106]: missing lifetime specifier
--> src/main.rs:7:34
|
7 | fn render_ascii_char(val: u8) -> Span {
| ^^^^ expected named lifetime parameter
|
= help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from
help: consider using the `'static` lifetime, but this is uncommon unless you're returning a borrowed value from a `const` or a `static`, or if you will only have owned values
|
7 | fn render_ascii_char(val: u8) -> Span<'static> {
| +++++++++
error[E0106]: missing lifetime specifier
--> src/main.rs:26:23
|
26 | fn test_function() -> Span {
| ^^^^ expected named lifetime parameter
|
= help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from
help: consider using the `'static` lifetime, but this is uncommon unless you're returning a borrowed value from a `const` or a `static`, or if you will only have owned values
|
26 | fn test_function() -> Span<'static> {
| +++++++++
For more information about this error, try `rustc --explain E0106`.
error: could not compile `span_lifetime` (bin "span_lifetime") due to 2 previous errors
使用<'static>
生命周期似乎不是一个好主意,因为我不只将此函数与常量一起使用。
使用引用val: &u8
作为参数,而不是val: u8
确实有效。但当传递的值超出范围时,就会产生问题。
到目前为止我的解决方案是指定生命周期:
fn render_ascii_char<'a>(val: u8) -> Span<'a> {
match val {
[...]
但我真的不明白为什么需要这样做,也不明白这一生的含义。
根据 的定义
Span
:您可以看到它包含一个,
Cow
其中可能包含变体中的引用Borrowed
:因此,结构本身需要用生命周期进行注释,因为您无法动态添加生命周期(这本质上是不可能的,因为类型和生命周期只是编译时构造!)。
由于您不满足任何可以省略生命周期的条件,因此您必须显式添加它。
'static
是在这里使用的正确生命周期,它根本不意味着您可以使用或只能使用Span
常量返回的值,而是它不包含任何生命周期短于 的引用'static
。