Статические функции в 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)
);
}
Обратите внимание на выражение инициализации ссылки на объявление функции. Очень интересно! &(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();
}
}