Как вернуть закрытие, которое возвращает признак impl в Rust

#rust #druid-rs

Вопрос:

Я использую набор пользовательского интерфейса druid, и это работает

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

Но я хочу добиться этого

 List::new(build_list_item())  

Поэтому я изменил функцию следующим образом

 fn build_list_item() -gt; impl Fn() -gt; impl Widgetlt;TodoItemgt; {  || {  Flex::row()  .with_child(Checkbox::new("").lens(TodoItem::completed))  .with_flex_child(  Label::new(|item: amp;TodoItem, _: amp;_| item.description.clone()),  1.0,  )  } }  

и получил ошибку компилятора, такую как

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

Как это исправить?

Комментарии:

1. Вы пробовали просто использовать List::new(build_list_item) свой исходный код?

2. @Ivan C, Отличный ответ, List::new(build_list_item) работает!

Ответ №1:

Поскольку размер возвращаемого Widget файла неизвестен во время компиляции, вы можете использовать следующее решение:

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