mirror of
https://github.com/ahgamut/rust-ape-example.git
synced 2024-10-31 21:48:49 +00:00
60 lines
1.5 KiB
Rust
60 lines
1.5 KiB
Rust
|
// ./src/fn/closures/input_parameters.md
|
||
|
|
||
|
|
||
|
// A function which takes a closure as an argument and calls it.
|
||
|
// <F> denotes that F is a "Generic type parameter"
|
||
|
fn apply<F>(f: F) where
|
||
|
// The closure takes no input and returns nothing.
|
||
|
F: FnOnce() {
|
||
|
// ^ TODO: Try changing this to `Fn` or `FnMut`.
|
||
|
|
||
|
f();
|
||
|
}
|
||
|
|
||
|
// A function which takes a closure and returns an `i32`.
|
||
|
fn apply_to_3<F>(f: F) -> i32 where
|
||
|
// The closure takes an `i32` and returns an `i32`.
|
||
|
F: Fn(i32) -> i32 {
|
||
|
|
||
|
f(3)
|
||
|
}
|
||
|
|
||
|
fn part0() {
|
||
|
use std::mem;
|
||
|
|
||
|
let greeting = "hello";
|
||
|
// A non-copy type.
|
||
|
// `to_owned` creates owned data from borrowed one
|
||
|
let mut farewell = "goodbye".to_owned();
|
||
|
|
||
|
// Capture 2 variables: `greeting` by reference and
|
||
|
// `farewell` by value.
|
||
|
let diary = || {
|
||
|
// `greeting` is by reference: requires `Fn`.
|
||
|
println!("I said {}.", greeting);
|
||
|
|
||
|
// Mutation forces `farewell` to be captured by
|
||
|
// mutable reference. Now requires `FnMut`.
|
||
|
farewell.push_str("!!!");
|
||
|
println!("Then I screamed {}.", farewell);
|
||
|
println!("Now I can sleep. zzzzz");
|
||
|
|
||
|
// Manually calling drop forces `farewell` to
|
||
|
// be captured by value. Now requires `FnOnce`.
|
||
|
mem::drop(farewell);
|
||
|
};
|
||
|
|
||
|
// Call the function which applies the closure.
|
||
|
apply(diary);
|
||
|
|
||
|
// `double` satisfies `apply_to_3`'s trait bound
|
||
|
let double = |x| 2 * x;
|
||
|
|
||
|
println!("3 doubled: {}", apply_to_3(double));
|
||
|
}
|
||
|
|
||
|
pub fn main() {
|
||
|
part0();
|
||
|
}
|
||
|
|