Как использовать статические времена жизни с потоками?
В настоящее время я борюсь с временами жизни в Rust (1.0), особенно когда речь идет о передаче структур по каналам.
Как бы я получить этот простой пример для компиляции:
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();
}
}
Я получил:
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...
Я понимаю, почему это так (line
живет только одну итерациюfor
), но я не могу понять, как это правильно сделать.
&str
в&'static str
?Я теряю память, если каждая строка будет иметь'static
продолжительность жизни?Когда я должен использовать'static
тем не мение? Это то, что я должен стараться избегать или это совершенно нормально?Есть ли лучший способ прохожденияString
S в структурах по каналам?Я прошу прощения за эти наивные вопросы. Я провел довольно много времени в поисках, но я не могу обернуть голову вокруг этого. Вероятно, это мешает моему динамическому языковому опыту :)
В сторону: есть&input[..]
для преобразованияString
в&str
считается нормально? Это единственный стабильный способ, который я мог найти, чтобы сделать это.