No código a seguir, não entendo por que o Span require alife . Como todos os argumentos implementam copy trait , meu entendimento é que o Span possui todas as variáveis necessárias.
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();
}
Este código usa ratatui
. Abaixo o Cargo.toml
:
[package]
name = "span_lifetime"
version = "0.1.0"
edition = "2024"
[dependencies]
crossterm = "0.27.0"
ratatui = "0.26.2"
Tenho a seguinte mensagem de erro ao compilar com 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
Usar uma <'static>
vida inteira não parece uma boa ideia, já que não uso essa função apenas com constantes.
Usar uma referência val: &u8
como argumento, em vez de val: u8
funcionar. Mas cria problemas quando o valor passado sai do escopo.
Minha solução até agora é especificar uma vida inteira:
fn render_ascii_char<'a>(val: u8) -> Span<'a> {
match val {
[...]
Mas eu realmente não entendo por que isso é necessário, nem as implicações desta vida.
Da definição de
Span
:Você pode ver que contém um
Cow
que pode conter uma referência naBorrowed
variante:e por causa disso, a própria estrutura precisa ser anotada com um tempo de vida, pois você não pode adicionar um tempo de vida dinamicamente (isso é inerentemente impossível porque tipos e tempos de vida são apenas uma construção em tempo de compilação!).
Como você não atende a nenhuma das condições nas quais o tempo de vida pode ser elidido , é necessário adicioná-lo explicitamente.
'static
é o tempo de vida correto para usar aqui, isso não significa que você use ou só possa usar o retornadoSpan
com constantes, mas sim que não contém nenhuma referência com vida útil menor que'static
.