Если вы прочитаете сообщение ближе, оно точно объяснит, в чем проблема:
`impl Trait` not allowed outside of function and inherent method return types
На данный момент вы можете использовать только impl Trait
:
- В качестве типа возврата функции:
fn
используется вне блока impl
.
- В качестве типа возврата встроенного метода:
fn
используется в блоке impl Type
.
И это все.
Следовательно, вы не можете сформировать черту Fn() -> impl X
.
Я хотел бы отметить, что, надеюсь, это временное ограничение, поскольку продолжается работа по расширению мест, где можно использовать impl X
, и желательны связанные типы и методы черт.
Почему это разрешено для первого impl Fn
, но не разрешено для второго?
Первый impl Fn
- это тип возвращаемого значения функции (y
), поэтому он разрешен. Вторым является тип возврата метода черты, поэтому это не так.
Как это можно сделать без использования кучи?
Вы можете вернуть конкретный экземпляр из первого Fn
.
Например, если вам не нужно указывать состояние, вместо этого вы можете вернуть fn(bool) -> bool
.
В противном случае вам нужно будет вручную создать структуру, которая инкапсулирует указанное состояние, чтобы иметь возможность называть тип, вместо того, чтобы полагаться на замыкание.