![](/img/trans.png)
[英]What's a proper way to use set_alert_notify to wake up main thread?
[英]What's the proper way to use variables defined in the main thread in a child thread in Rust?
我是 Rust 的新手,仍在閱讀 Rust 書。 下面是我的程序。
use clap::{App, Arg};
type GenericError = Box<dyn std::error::Error + Send + Sync + 'static>;
type GenericResult<T> = Result<T, GenericError>;
fn main() -> GenericResult<()> {
let matches = App::new("test")
.arg(Arg::new("latency")
.takes_value(true))
.get_matches();
let latency_present = matches.is_present("latency");
let latency = matches.value_of("latency").unwrap_or("1000:10,300:30");
let latency_pairs: Vec<&str> = latency.split(",").collect();
let checker = std::thread::spawn(move || -> GenericResult<()>{
loop {
if latency_present {
for (i, latency_pair) in latency_pairs.iter().enumerate() {
// let latency_pair: Vec<&str> = latency_pair.split(":").collect();
// let latency = latency_pair[0].parse::<f64>().unwrap();
}
}
}
});
checker.join().unwrap()?;
Ok(())
}
當我運行它時,它告訴我:
error[E0597]: `matches` does not live long enough
--> src\main.rs:14:19
|
14 | let latency = matches.value_of("latency").unwrap_or("1000:10,300:30");
| ^^^^^^^--------------------
| |
| borrowed value does not live long enough
| argument requires that `matches` is borrowed for `'static`
...
30 | }
| - `matches` dropped here while still borrowed
我不太明白這里的錯誤信息。 但我想這是因為我在checker
線程中使用了latency_pairs
,並且在checker
仍在執行時可能會丟棄latency_pairs
。 我的理解正確嗎? 如何修復錯誤? 我for (i, latency_pair) in latency_pairs.clone().iter().enumerate() {
以便為線程傳遞一個克隆值,但它沒有幫助。
latency_pairs
將引用保存到latency
中,延遲又引用matches
。 因此克隆latency_pairs
只是將引用克隆到latency
和matches
。
您的代碼將要求latency
的類型是&'static str
但它實際上是&'a str
其中'a
綁定到matches
' 生命周期。
您可以在latency
上調用to_owned()
以獲取擁有的值並在閉包內拆分字符串,或者您可以在latency_pairs
中收集的每個拆分上調用to_owned()
並將該Vec<String>
移動到閉包中:
let latency_pairs: Vec<String> = latency.split(",").map(ToOwned::to_owned).collect();
let checker = std::thread::spawn(move || -> GenericResult<()>{
loop {
if latency_present {
for (i, latency_pair) in latency_pairs.iter().enumerate() {
// let latency_pair: Vec<&str> = latency_pair.split(":").collect();
// let latency = latency_pair[0].parse::<f64>().unwrap();
}
}
}
});
如果您需要在閉包之外使用latency_pairs
,您可以在將其移入閉包之前對其進行克隆:
let latency_pairs: Vec<String> = latency.split(",").map(ToOwned::to_owned).collect();
let latency_pairs_ = latency_pairs.clone();
let checker = std::thread::spawn(move || -> GenericResult<()>{
loop {
if latency_present {
for (i, latency_pair) in latency_pairs_.iter().enumerate() {
// let latency_pair: Vec<&str> = latency_pair.split(":").collect();
// let latency = latency_pair[0].parse::<f64>().unwrap();
}
}
}
});
println!("{:?}", latency_pairs);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.