Skip to content

Latest commit

 

History

History
109 lines (95 loc) · 2.82 KB

ch-14-anonimus-functions.md

File metadata and controls

109 lines (95 loc) · 2.82 KB

Анонимные функции

Статические функции в Rust не могут иметь доступ к локальным переменным.

fn main() {
    let three = 3;
    fn print_triple(x: u8) {
        print!("{}", x * three);
    }
    print_triple(7);
}

Для этого могут использоваться только внешние статические переменные и константы.

Константа:

const THREE: u8 = 3;
fn print_triple(x: u8) {
    print!("{}", x * THREE);
}
fn main() {
    print_triple(7);
}

Статическая переменная:

static THREE: u8 = 3;
fn print_triple(x: u8) {
    print!("{}", x * THREE);
}
fn main() {
    print_triple(7);
}

Примеры использования анонимной функции

Вызов анонимной функции может выглядеть следующим образом:

fn main() {
    let mut arr = [34, 708, 16, 160, 90, 0, 645, 512, 27];
    use std::cmp::Ordering;
    // let desc = |a: &i32, b: &i32| -> Ordering {
    //     if a < b { Ordering::Greater }
    //     else if a > b { Ordering::Less }
    //     else { Ordering::Equal }
    // };
    arr.sort_by(|a: &i32, b: &i32| -> Ordering {
        if a < b {
            Ordering::Greater
        } else if a > b {
            Ordering::Less
        } else {
            Ordering::Equal
        }
    });
    print!("{:?}", arr);
}

Или так:

fn main() {
    
    let multiply = |a| a * 6;
    
    print!("{}", multiply(14));
    
    let multiply_ref: &(Fn(i8) -> i8) = &multiply;
    print!(
        " {} {}",
        (*multiply_ref)(14),
        multiply_ref(14)
        );
}

Rust Playground

Обратите внимание на выражение инициализации ссылки на объявление функции. Очень интересно! &(Fn(i8) -> i8).

Домашнее задание

Пожалуйста, напишите объявление переменных различных функций и присвойте им значения.

Ещё примеры работы с анонимными функциями:

fn main() {
    {
        let anonimus = || -> () { println!("-----") };
        let ref_item: &(Fn() -> ()) = &anonimus;
        println!("{:?}", ref_item());
        anonimus();
        ref_item();
    }
    {
        fn main(){println!("main")}
        let main1 = || -> () {  };
        
        let anonimus:&(Fn()->()) = &main1;
        println!("{}", std::mem::size_of_val(&anonimus));
        main1();
        anonimus();
        let anonimus:&(Fn()->()) = &main;
        main();
        anonimus();
    }
}