Возврат замыкания из замыкания в качестве возвращаемого значения для функции - PullRequest
1 голос
/ 18 мая 2019

Я пытаюсь привыкнуть к impl Fn, но я не понимаю ошибку для этого кода:

fn y(state: bool) -> impl Fn() -> impl Fn(bool) -> bool {
    move || {
        println!("state, {}", state);
        |x: bool| {
            println!("state, {}", state);
            !x
        }
    }
}

fn main() {
    y(true)()(true);
}

Ошибка:

error[E0562]: `impl Trait` not allowed outside of function and inherent method return types
 --> src/main.rs:1:35
  |
1 | fn y(state: bool) -> impl Fn() -> impl Fn(bool) -> bool {
  |                                   ^^^^^^^^^^^^^^^^^^^^^
  1. Почему это разрешено для первого impl Fn, но не разрешено для второго?
  2. Как это можно сделать без использования кучи (через Box и т. Д.)?

1 Ответ

3 голосов
/ 18 мая 2019

Если вы прочитаете сообщение ближе, оно точно объяснит, в чем проблема:

`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.

В противном случае вам нужно будет вручную создать структуру, которая инкапсулирует указанное состояние, чтобы иметь возможность называть тип, вместо того, чтобы полагаться на замыкание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...