【问题标题】:How to return a closure which returns an impl trait in Rust如何在 Rust 中返回一个返回 impl trait 的闭包
【发布时间】:2021-11-18 06:38:27
【问题描述】:

我正在使用 druid 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())

所以我这样修改函数

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> {
   |                                       ^^^^^^^^^^^^^^^^^^^^^

如何解决?

【问题讨论】:

  • 您是否尝试过将List::new(build_list_item) 与您的原始代码一起使用?
  • @Ivan C,很好的答案,List::new(build_list_item) 有效!

标签: rust druid-rs


【解决方案1】:

因为返回的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());

【讨论】:

    猜你喜欢
    • 2021-02-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多