Можно ли вернуть закрытие Rust, которое возвращает закрытие без использования Box? - PullRequest
0 голосов
/ 29 сентября 2018

Внутреннюю крышку легко обернуть внутрь Box:

fn add1() -> impl Fn(i32) -> Box<Fn(i32) -> i32> {
    |x| Box::new(|y| x + y)
}

Но нужно ли использовать Box?В следующем коде:

fn add2() -> ?? {
    |x: i32| move |y: i32| x + y
}

Могу ли я заменить ?? на что-то, чтобы проверить тип кода?

1 Ответ

0 голосов
/ 29 сентября 2018

Нет.Как вы уже знаете, impl Trait - это механизм возврата экземпляра черты без бокса.

Если вы попытаетесь расширить это:

fn add2() -> impl Fn(i32) -> impl Fn(i32) -> i32 {
    |x| |y| x + y
}

Компилятор скажет вам:

error[E0562]: `impl Trait` not allowed outside of function and inherent method return types
 --> src/lib.rs:9:30
  |
9 | fn add2() -> impl Fn(i32) -> impl Fn(i32) -> i32 {
  |                              ^^^^^^^^^^^^^^^^^^^

Из impl Trait RFC, выделите мое:

impl Trait может быть записан только в пределах типа возврата автономной или врожденной функции impl, но не в определениях признаков или какой-либо позиции невозвращаемого типа.Они также могут не отображаться в возвращаемом типе закрывающих признаков или указателей на функции, если только они сами не являются частью допустимого возвращаемого типа.

  • В конечном итоге мы захотим разрешить этой функции бытьиспользуется в чертах

Возвращаемым типом закрытия является связанный тип свойства закрытия:

pub trait FnOnce<Args> {
    type Output;
    extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
}

См. также:

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