无法在Rust - GTK程序中获得要编译的密钥处理程序

r6vfmomb  于 2023-02-23  发布在  其他
关注(0)|答案(1)|浏览(113)

我担心这可能是一个愚蠢的错误,但我没有看到它。下面的代码:

let key_handler = gtk::EventControllerKey::new();
controller.obj().add_controller(&key_handler);
key_handler.connect_key_pressed(clone!(@weak controller => move |_ctlr, key, _code, state| {
    controller.keyboard_input(key, state);
    gtk::Inhibit(false)
}));

不会编译。它会得到错误:

error[E0069]: `return;` in a function whose return type is not `()`
  --> src/controller/imp.rs:80:45
   |
80 |               key_handler.connect_key_pressed(clone!(@weak controller => move |_ctlr, key, _code, state| {
   |  _____________________________________________^
81 | |                 controller.keyboard_input(key, state);
82 | |                 gtk::Inhibit(false)
83 | |             }
84 | |             )
   | |_____________^ return type is not `()`
   |
   = note: this error originates in the macro `clone` (in Nightly builds, run with -Z macro-backtrace for more info)

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

我认为问题出在clone!扩展中,但我不确定。我是不是错过了一些简单的方法来修复这个问题,或者这不是使用clone的正确方法?就在它上面,我有

controller.start_buttonx.connect_clicked(clone!(@weak controller => move |xx| BOARDS[1].emit_by_name::<()>("test-signal", &[&x])));

看起来非常相似,这没有问题。

wqsoz72f

wqsoz72f1#

您还没有提供minimal reproducible example,这里有很多依赖项,所以我不打算尝试重现您的错误,但我将进行猜测。
Rust错误信息通常真的很好,所以你应该仔细阅读,试着理解它们的意思。
返回类型不是()的函数中的return;
=注意:此错误源于宏clone
这告诉我clone!宏正在返回一个函数或闭包,其中包含这样一行代码:

return;

这是可以的,但是只有当函数的返回类型是()时才有效。clone!的输入包含一个闭包,所以我猜这是以某种方式组合到生成的闭包中的。但是你的闭包返回Inhibitaccording to the GTK docs,是一个结构体。
这导致类型检查器认为闭包的返回类型是Inhibit,因为宏中可能没有类型注解,这与宏本身添加的return;语句冲突。
您可以通过添加分号来修复此问题:

gtk::Inhibit(false);

相关问题