< 返回版块

zengql 发表于 2022-11-26 16:08

Tags:actix-web,所有权

 // redis
    let redis_client_rlt = redis::Client::open("redis://XXXXX/");
    if let Err(_) = redis_client_rlt  {
        dbg!("[core]-[main]-[start]--redis start faild");
        return Ok(());
    }
    let redis_client = redis_client_rlt.unwrap();

    std::env::set_var("RUST_LOG", "debug");
    log4rs::init_file("./core/log4rs.yml", Default::default()).unwrap();
    
    HttpServer::new(
        move|| {
        let json_config = web::JsonConfig::default()
        .limit(4096)
        .error_handler(|err, _req| {
            // create custom error response
            InternalError::from_response(err, HttpResponse::Conflict().finish())
                .into()
        });    
        App::new()
        .app_data(Data::new(s.clone()))
        .app_data(Data::new(redis_client.clone()))
        .app_data(json_config)
        .configure(service::config_app)
        }
    )
    .bind("127.0.0.1:8080")?
    .run()
    .await

主要在这两行,为什么要显式调用clone函数,不能直接直接所有权转移到闭包内吗 .app_data(Data::new(s.clone())) .app_data(Data::new(redis_client.clone())

评论区

写评论
作者 zengql 2022-11-26 16:48

还是学的不好,感谢回答

--
👇
fakeshadow: HttpServer::new接受的是Fn闭包,需要满足多次调用闭包返回App实例的条件。闭包捕获的变量一般通过Clone或者Copy满足该条件。

fakeshadow 2022-11-26 16:30

HttpServer::new接受的是Fn闭包,需要满足多次调用闭包返回App实例的条件。闭包捕获的变量一般通过Clone或者Copy满足该条件。

1 共 2 条评论, 1 页