Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 对tokio::spawn(异步移动)中的变量生存期感到困惑_Asynchronous_Rust_Lifetime_Spawn_Tokio - Fatal编程技术网

Asynchronous 对tokio::spawn(异步移动)中的变量生存期感到困惑

Asynchronous 对tokio::spawn(异步移动)中的变量生存期感到困惑,asynchronous,rust,lifetime,spawn,tokio,Asynchronous,Rust,Lifetime,Spawn,Tokio,我是rust和tokio async的新手,我正在尝试编译以下看似简单的代码: async fn network_handler(network_config: &config::NetworkConfig) -> Result<(), Error> { Ok(()) } pub async fn run(network_config: &config::NetworkConfig) -> Result<(), Error> {

我是rust和tokio async的新手,我正在尝试编译以下看似简单的代码:

async fn network_handler(network_config: &config::NetworkConfig) -> Result<(), Error> {
    Ok(())
}

pub async fn run(network_config: &config::NetworkConfig) -> Result<(), Error> {
    let network_config_copy = network_config.clone();
    tokio::spawn(async move {
        network_handler(&network_config_copy).await
    }).await?
}

如果要克隆
NetworkConfig
值,请为其声明
clone
特性:

#[derive(Debug, Clone)]
pub struct NetworkConfig {
    pub bind: String,
    pub node_key_file: String,
}
否则,对于receiver方法查找规则,您将通过调用引用的
克隆
以下是:

您可能会问为什么这样做,实际上仍然会将引用传递给
network\u handler()

这是因为
network\u config
在spawn async块内移动,并且
这将使异步块的推断类型获得静态生存期。

还请注意,实现帮助提示(将tokio::spawn替换为tokio::spawn+’)编译器给出的答案会导致语法错误。这个答案值得关注:它不仅解决了问题,而且比大多数关于这个主题的教程更深入地了解了异步/生命周期。恭喜你@attdona!
#[derive(Debug, Deserialize)]
pub struct NetworkConfig {
    pub bind: String,
    pub node_key_file: String,
}
#[derive(Debug, Clone)]
pub struct NetworkConfig {
    pub bind: String,
    pub node_key_file: String,
}
impl<'_, T> Clone for &'_ T
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()));
}