我担心这可能是一个愚蠢的错误,但我没有看到它。下面的代码:
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])));
看起来非常相似,这没有问题。
1条答案
按热度按时间wqsoz72f1#
您还没有提供minimal reproducible example,这里有很多依赖项,所以我不打算尝试重现您的错误,但我将进行猜测。
Rust错误信息通常真的很好,所以你应该仔细阅读,试着理解它们的意思。
返回类型不是
()
的函数中的return;
=注意:此错误源于宏
clone
这告诉我
clone!
宏正在返回一个函数或闭包,其中包含这样一行代码:这是可以的,但是只有当函数的返回类型是
()
时才有效。clone!
的输入包含一个闭包,所以我猜这是以某种方式组合到生成的闭包中的。但是你的闭包返回Inhibit
,according to the GTK docs,是一个结构体。这导致类型检查器认为闭包的返回类型是
Inhibit
,因为宏中可能没有类型注解,这与宏本身添加的return;
语句冲突。您可以通过添加分号来修复此问题: