Rust — доводчики и анонимность типов
В Rust у нас есть концепции Closures и Type Anonymity, которые служат двум целям. Замыкания отвечают за включение функций во вмещающие среды, в то время как анонимность типов связывает неограниченные параметры типа с трейтами, чтобы мы могли указывать типы.
Закрытия:
В Rust у нас есть возможность создавать анонимные функции, которые принимают аргументы, известные как замыкания. Замыкания всегда анонимны, поэтому мы привязываем их к ссылкам. Всякий раз, когда возникает необходимость захвата функций во включающей среде, мы специально используем замыкания.
Особенности закрытия:
- Они используют || для входных переменных
- Они также могут захватывать переменные внешней среды.
- У них есть необязательный {} для одиночных выражений и обязательный для функций.
Синтаксис:
|num| num + x
Пример 1:
Rust
//Rust - Closers fn main() { let mult_one = |num| { 5 * num }; println!( "The multiplication of 5 and 10 is {}." , mult_one(10)); } |
Выход:
Пример 2:
Rust
// Rust - Closers fn main() { let var: i32 = 20; let print_var = || { println!( "variable is: {}" , var); }; print_var(); } |
Выход:
Объяснение:
В этом примере мы объявили переменную с именем 'var' и присвоили ей значение 20. Поскольку мы знаем, что анонимные функции закрывают среду, поэтому || синтаксис относится к анонимному закрытию, которое не принимает аргументов.
Пример 3:
Rust
// Rust - Closers fn main() { fn func_one(x: i32) -> i32 { x + 10 } let annotated_closure_variable = |x: i32| -> i32 { x + 5 }; let x = 10; println!( "function value: {}" , func_one(x)); println!( "Value of annotated_closure: {}" , annotated_closure_variable(x)); let var = || 5; println!( "closure returning var: {}" , var()); } |
Выход:
Объяснение:
В этом примере мы реализуем замыкания и функции, увеличивая значения. В функции func_one мы передаем x в качестве аргумента, который имеет i32 (32-битное целое число). Значение func_one увеличивается на 10. Затем мы объявляем annoted_closure_variable, а их значение x увеличивается на 5. Затем мы объявляем переменную x, а затем вызываем функцию и замыкания соответственно. Здесь var — это замыкание.
Тип Анонимность:
В Rust есть концепция анонимности типов. В ситуациях, когда определены замыкания, компилятор Rust создает анонимные структуры, так что переменные внутри реализуются путем создания трейтов. Для этого неизвестного типа обычно требуются дженерики. Поэтому, чтобы указать анонимность типов, мы привязали переменную по типам для указания большинства типов.
Пример 4:
Rust
Rust Type Anonymity fn gfg<G>(f: G) where G: Fn() { f(); } fn main() { let var = 10; let value = || println!( " Value of var: {}" , var); gfg(value); } |
Выход:
Объяснение:
В этом примере 'G' реализует Fn, которое представляет собой замыкание, которое не принимает входных данных и ничего не возвращает. Мы объявили признак функции GFG, где gfg G: Fn и f() - это функция. Теперь мы объявляем переменную «var» и присваиваем ей значение 10. Таким образом, var фиксируется в анонимном типе и реализуется так, чтобы Fn сохранялась в «value». Мы передаем значение в черту функции gfg, и результат показан выше.