值在 main 中存在的时间不够长

问题描述 投票:0回答:1

在编写一些 Rust 时,我遇到了此代码的问题:

fn main() {
    let session = Connection::new_session().unwrap();

    let manager = DBusManager::new(&session);

    let tray = ksni::TrayService::new(VariaTray {
        visible: false,
        manager: manager.clone(),
    });

    tray.run();
}

我正在制作一个运行托盘图标并通过 D-Bus 与另一个程序通信的程序,但是当我尝试编译它时遇到此错误。

error[E0597]: `session` does not live long enough
  --> src/main.rs:50:36
   |
48 |     let session = Connection::new_session().unwrap();
   |         ------- binding `session` declared here
49 |
50 |     let manager = DBusManager::new(&session);
   |                   -----------------^^^^^^^^-
   |                   |                |
   |                   |                borrowed value does not live long enough
   |                   argument requires that `session` is borrowed for `'static`
...
58 | }
   | - `session` dropped here while still borrowed

For more information about this error, try `rustc --explain E0597`.

我不确定如何解决这个问题。看起来它不应该导致这个错误,因为该值在程序结束时被删除,但我是 Rust 新手,所以我还不太了解它的行为。我可以寻求帮助吗?
(我在此代码中使用 dbus-rsksni 板条箱,以及用于包装 D-Bus 操作的自定义结构。)

rust dbus
1个回答
0
投票

您自己可能定义

DBusManager
来包含
&'static Connection
。然后,当向其中传递临时引用时,Rust 会正确地抱怨它。

以下是我建议的一些替代方案:

  1. 更改

    DBusManager
    以获取拥有的
    Connection
    ,并直接传递它而不是引用。

  2. 如果您仍需要在

    DBusManager
    以外的位置对原始连接进行不可变访问,请接受
    Arc<Connection>
    中的
    DBusManager

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.