Если вы хотите клонировать значение NetworkConfig
, объявите для него черту Clone
:
#[derive(Debug, Clone)]
pub struct NetworkConfig {
pub bind: String,
pub node_key_file: String,
}
В противном случае, для правил поиска метода получателя вы в конечном итоге вызовете Clone
на ссылка через следующий Clone
реализатор :
impl<'_, T> Clone for &'_ T
И клонированная ссылка будет иметь время жизни, ограниченное областью действия clone()
.
С derive(Clone)
функция run
компилируется, но работает только тогда, когда аргумент network_config
имеет 'static
время жизни, из-за tokio :: spawn требование времени жизни.
Вероятно, это не то, что ты хочешь. Если это так, передайте NetworkConfig
по значению и в конечном итоге клонируйте его в контексте вызывающей стороны.
use async_std::io::Error;
use tokio;
mod config {
#[derive(Debug, Clone)]
pub struct NetworkConfig {
pub bind: String,
pub node_key_file: String,
}
}
async fn network_handler(network_config: &config::NetworkConfig) -> Result<(), Error> {
println!("using {:?}", network_config);
Ok(())
}
pub async fn run(network_config: config::NetworkConfig) -> Result<(), Error> {
tokio::spawn(async move { network_handler(&network_config).await }).await?
}
#[tokio::main]
async fn main() {
let config = config::NetworkConfig {
bind: "my_bind".to_owned(),
node_key_file: "abc".to_owned(),
};
tokio::spawn(run(config.clone()));
}
Вы можете спросить, почему это работает, действительно, ссылка все еще передается на network_handler()
.
Это потому, что network_config
перемещается внутри блока spawn asyn c и это делает получение времени жизни stati c для логического типа блока asyn c.