繁体   English   中英

如何返回在 Rust 中返回 impl 特征的闭包

[英]How to return a closure which returns an impl trait in Rust

我正在使用德鲁伊 ui 套件,这正在工作

fn build_list_item() -> impl Widget<TodoItem> {
    Flex::row()
        .with_child(Checkbox::new("").lens(TodoItem::completed))
        .with_flex_child(
            Label::new(|item: &TodoItem, _: &_| item.description.clone()),
            1.0,
        )
}
// and then
List::new(|| build_list_item())

但我想实现这个

List::new(build_list_item())

所以我像这样修改了function

fn build_list_item() -> impl Fn() -> impl Widget<TodoItem> {
    || {
        Flex::row()
            .with_child(Checkbox::new("").lens(TodoItem::completed))
            .with_flex_child(
                Label::new(|item: &TodoItem, _: &_| item.description.clone()),
                1.0,
            )
    }
}

并得到编译器错误

error[E0562]: `impl Trait` not allowed outside of function and method return types
  --> src/main.rs:33:39
   |
33 | fn build_list_item2() -> impl Fn() -> impl Widget<TodoItem> {
   |                                       ^^^^^^^^^^^^^^^^^^^^^

如何解决?

因为在编译时不知道返回的Widget的大小您可以使用以下解决方案:

fn build_list_item() -> impl Fn() -> Flex<TodoItem> {
    &|| {Flex::row()
        .with_child(Checkbox::new("").lens(TodoItem::completed))
        .with_flex_child(
            Label::new(|item: &TodoItem, _: &_| item.description.clone()),
            1.0,
        )}
}
// and then
List::new(build_list_item());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM