Заимствованная и захваченная переменная в RUST - PullRequest
0 голосов
/ 04 ноября 2019

Я работаю с paho_mqtt и хочу отправлять сообщения по темам в соответствии с полученными. Я разделил свой код на вложенные функции и использую переменную cli (см. Код ниже). Я думаю, что мне нужно использовать ссылки, чтобы иметь рабочий код, но я все еще не понимаю, как. Спасибо за вашу помощь.

Код:

fn publish_fail_msg(cli: mqtt::AsyncClient, topic: String){
        let msg = mqtt::Message::new(topic, "Fail", QOS[0]);
        cli.publish(msg);
}

fn manage_msgs(cli: mqtt::AsyncClient, msg: mqtt::Message){
        let topic = msg.topic();
        let payload_str = msg.payload_str();

        match topic {
                "main"  => publish_new_topic(cli, payload_str.to_string()),
                _       => publish_fail_msg(cli, topic.to_string()),
        }
}

fn main() -> mqtt::AsyncClient {
        // Create the client connection
        let mut cli = mqtt::AsyncClient::new(create_opts).unwrap_or_else(|e| {
                println!("Error creating the client: {:?}", e);
                process::exit(1);
        });

        // Attach a closure to the client to receive callback on incoming messages.
        cli.set_message_callback(|_cli, msg| {
                if let Some(msg) = msg {
                        manage_msgs(cli, msg);
                }
        });

        cli
}

Ошибка:

error[E0507]: cannot move out of captured variable in an `FnMut` closure
   --> src/main.rs:230:25
    |
212 |     let mut cli = mqtt::AsyncClient::new(create_opts).unwrap_or_else(|e| {
    |         ------- captured outer variable
...
230 |             manage_msgs(cli, msg);
    |                         ^^^ cannot move out of captured variable in an `FnMut` closure

error[E0505]: cannot move out of `cli` because it is borrowed
   --> src/main.rs:228:30
    |
228 |     cli.set_message_callback(|_cli, msg| {
    |     --- -------------------- ^^^^^^^^^^^ move out of `cli` occurs here
    |     |   |
    |     |   borrow later used by call
    |     borrow of `cli` occurs here
229 |         if let Some(msg) = msg {
230 |             manage_msgs(cli, msg);
    |                         --- move occurs due to use in closure

error[E0382]: borrow of moved value: `cli`
   --> src/main.rs:248:5
    |
212 |     let mut cli = mqtt::AsyncClient::new(create_opts).unwrap_or_else(|e| {
    |         ------- move occurs because `cli` has type `mqtt::AsyncClient`, which does not implement the `Copy` trait
...
228 |     cli.set_message_callback(|_cli, msg| {
    |                              ----------- value moved into closure here
229 |         if let Some(msg) = msg {
230 |             manage_msgs(cli, msg);
    |                         --- variable moved due to use in closure
...
248 |     cli.connect_with_callbacks(conn_opts, on_connect_success, on_connect_failure);
    |     ^^^ value borrowed here after move

1 Ответ

0 голосов
/ 04 ноября 2019

Дьявол кроется в деталях: я обнаружил проблему , то есть _cli. Я заменил его на cli: &mqtt::AsyncClient, и я мог бы отправить ссылку на мои вложенные функции. Может быть, есть лучшие решения для этого, и было бы приятно увидеть их.

...