在编写一些 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-rs 和 ksni 板条箱,以及用于包装 D-Bus 操作的自定义结构。)
您自己可能定义
DBusManager
来包含 &'static Connection
。然后,当向其中传递临时引用时,Rust 会正确地抱怨它。
以下是我建议的一些替代方案:
更改
DBusManager
以获取拥有的 Connection
,并直接传递它而不是引用。
如果您仍需要在
DBusManager
以外的位置对原始连接进行不可变访问,请接受 Arc<Connection>
中的 DBusManager
。