Rust — функции с замыканием в качестве параметра

Опубликовано: 18 Февраля, 2023

В Rust есть анонимные функции, которые принимают замыкание в качестве параметров. В замыканиях обычно не требуется аннотировать типы параметров или возвращаемых значений, в отличие от функций. Замыкания хранятся в переменных и используются без необходимости давать им имена и предоставлять их пользователям библиотек кода. Замыкания обычно используются для вывода типов переменных. Аннотации типов необходимы для применения функций, поскольку типы обычно являются частью явного интерфейса, доступного для пользовательской библиотеки кода.

Принимая замыкания в качестве входных параметров, тип замыкания аннотируется трейтами.

Прежде чем приступить к примеру, нам нужно знать некоторые термины, связанные с чертами:

  • Fn относится к замыканиям, которые используют захваченное значение по ссылке.
  • FnOnce относится к замыканию, которое используется при захвате по значению.

Пример 1:

Rust




// Rust code for Functions With Closure as Parameter
fn gfg<G>(f: G) where
      
    G: FnOnce() {
  
    f();
}
#[allow(dead_code)]
  
fn apply_function<G>(f: G) -> i32 where
    G: Fn(i32) -> i32 {
    f(3)
}
  
fn main() {
    use std::mem;
  
    let string_one = "Hackathons";
    let mut string_two = "GFG ".to_owned();
    let value = || {
        
        // `greeting` is by reference: requires `Fn`.
        println!("GeeksforGeeks {}.", string_one);
        string_two.push_str("Courses");
        println!("Learning Coding from {}.", string_two);
         
        mem::drop(string_two);
    };
    gfg(value);
}

Выход:

Объяснение:

В этом примере мы объявили Fn и FnOnce как две черты. Здесь <G> относится к G, который является параметром универсального типа. gfg объявлен как функция, которая принимает аргумент закрытия и вызывает его. Замыкание G:FnOne не принимает никаких входных параметров и, следовательно, ничего не возвращает одновременно. Функция apply_funvyion принимает замыкание 32-битного целого числа и также возвращает его. std::mem используется для управления памятью и предоставляет основные функции, связанные с памятью. Мы объявили две строки string_one и string_two (изменяемые). string_two является изменяемым по своей природе и является некопируемым типом, а to_owned является заимствованной концепцией, отвечающей за заимствование данных. Теперь мы объявили переменную с именем value, которая захватывает две переменные string_one по ссылке и string_two по значению. Если мы внимательно посмотрим на функцию, мы увидим, что для string_one требуется ссылка с именем «Fn», а из-за мутации string_two требуется FnMit в качестве изменяемой ссылки, чтобы она была захвачена. После того, как наша работа выполнена, мы удаляем 'string_two' с помощью std::mem, так что string_two захватывается значением, которое, в свою очередь, требует Fn) еще раз. Наконец, вызовите функцию gfg и передайте «значение» в качестве замыкания.