Как выходные параметры

Замыкания могут использоваться как входные параметры, следовательно их возврат в качестве выходных параметров также должен быть возможен. Однако, это сопряжено с трудностями из-за того, что Rust в настоящее время поддерживает только возврат конкретных (не обобщённых) типов. Типы анонимных замыканий, по определению, неизвестны. И поэтому возвращение замыканий возможно только путём конкретизации их типов. Это можно реализовать упаковав замыкание.

Возможные типажи для возвращаемых значений немного отличаются от прежних:

  • Fn: как раньше
  • FnMut: как раньше
  • FnOnce: здесь присутствуют некоторые неожиданности, поэтому необходим тип FnBox, но он нестабилен в настоящее время. В будущем ожидаются изменения этой ситуации.

Помимо этого, должно быть использовано ключевое слово move, чтобы сигнализировать о том, что все переменные захватываются по значению. Это необходимо, так как любые захваченные по ссылке значения будут удалены после выхода из функции, оставляя недопустимые ссылки в замыкании.

fn create_fn() -> Box<Fn()> {
    let text = "Fn".to_owned();

    Box::new(move || println!("Это a: {}", text))
}

fn create_fnmut() -> Box<FnMut()> {
    let text = "FnMut".to_owned();

    Box::new(move || println!("Это a: {}", text))
}

fn main() {
    let fn_plain = create_fn();
    let mut fn_mut = create_fnmut();

    fn_plain();
    fn_mut();
}

Смотрите также:

Упаковка, Fn, FnMut, and Обобщённые типы.