Rust
클로저 및 람다 식
수색…
간단한 람다 식
// A simple adder function defined as a lambda expression.
// Unlike with regular functions, parameter types often may be omitted because the
// compiler can infer their types
let adder = |a, b| a + b;
// Lambdas can span across multiple lines, like normal functions.
let multiplier = |a: i32, b: i32| {
let c = b;
let b = a;
let a = c;
a * b
};
// Since lambdas are anonymous functions, they can be called like other functions
println!("{}", adder(3, 5));
println!("{}", multiplier(3, 5));
다음이 표시됩니다.
8
15
간단한 폐쇄
일반 함수와 달리 람다 식은 해당 환경을 캡처 할 수 있습니다. 이러한 람다는 폐쇄라고합니다.
// variable definition outside the lambda expression...
let lucky_number: usize = 663;
// but the our function can access it anyway, thanks to the closures
let print_lucky_number = || println!("{}", lucky_number);
// finally call the closure
print_lucky_number();
그러면 다음과 같이 인쇄됩니다.
663
명시 적 반환 유형이있는 Lambda
// lambda expressions can have explicitly annotated return types
let floor_func = |x: f64| -> i64 { x.floor() as i64 };
람다 주위를 지나가 다.
람다 함수는 값 자체이므로 컬렉션에 저장하고 다른 값과 마찬가지로 함수에 전달합니다.
// This function takes two integers and a function that performs some operation on the two arguments
fn apply_function<T>(a: i32, b: i32, func: T) -> i32 where T: Fn(i32, i32) -> i32 {
// apply the passed function to arguments a and b
func(a, b)
}
// let's define three lambdas, each operating on the same parameters
let sum = |a, b| a + b;
let product = |a, b| a * b;
let diff = |a, b| a - b;
// And now let's pass them to apply_function along with some arbitary values
println!("3 + 6 = {}", apply_function(3, 6, sum));
println!("-4 * 9 = {}", apply_function(-4, 9, product));
println!("7 - (-3) = {}", apply_function(7, -3, diff));
그러면 다음과 같이 인쇄됩니다.
3 + 6 = 9
-4 * 9 = -36
7 - (-3) = 10
함수에서 람다 반환하기
함수에서 람다 (또는 클로저)를 반환하는 것은 특성을 구현하기 때문에 까다로울 수 있습니다. 따라서 정확한 크기는 거의 알 수 없습니다.
// Box in the return type moves the function from the stack to the heap
fn curried_adder(a: i32) -> Box<Fn(i32) -> i32> {
// 'move' applies move semantics to a, so it can outlive this function call
Box::new(move |b| a + b)
}
println!("3 + 4 = {}", curried_adder(3)(4));
다음과 같이 표시됩니다 : 3 + 4 = 7
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow