Como uso vidas estáticas com threads?
Atualmente, estou lutando com as vidas em Rust (1.0), especialmente quando se trata de passar estruturas por canais.
Como eu obteria este exemplo simples para compilar:
use std::sync::mpsc::{Receiver, Sender};
use std::sync::mpsc;
use std::thread::spawn;
use std::io;
use std::io::prelude::*;
struct Message<'a> {
text: &'a str,
}
fn main() {
let (tx, rx): (Sender<Message>, Receiver<Message>) = mpsc::channel();
let _handle_receive = spawn(move || {
for message in rx.iter() {
println!("{}", message.text);
}
});
let stdin = io::stdin();
for line in stdin.lock().lines() {
let message = Message {
text: &line.unwrap()[..],
};
tx.send(message).unwrap();
}
}
Eu recebo:
error[E0597]: borrowed value does not live long enough
--> src/main.rs:23:20
|
23 | text: &line.unwrap()[..],
| ^^^^^^^^^^^^^ does not live long enough
...
26 | }
| - temporary value only lives until here
|
= note: borrowed value must be valid for the static lifetime...
Eu posso ver por que isso é (line
vive apenas por uma iteração defor
), mas não consigo descobrir qual é a maneira correta de fazer isso.
&str
para dentro&'static str
?Estou vazando memória se cada linha tiver um'static
tempo de vida?Quando devo usar'static
de qualquer forma? É algo que eu deveria tentar evitar ou está perfeitamente bem?Existe uma maneira melhor de passarString
s em estruturas via canais?Peço desculpas por essas perguntas ingênuas. Já passei bastante tempo pesquisando, mas não consigo entender direito. Provavelmente é o meu histórico de linguagem dinâmica atrapalhando :)
Como um aparte: É&input[..]
para converter umString
dentro de&str
considerado bom? É a única maneira estável que eu poderia encontrar para fazer isso.