Rust에서 함수를 매개 변수로 어떻게 전달합니까?
가능한 한 가능하다면 Rust에서 매개 변수로 함수를 전달할 수 있습니까 (아마 예).
할 수 없다면 좋은 대안입니다.
구문을 시도했지만 얻지 못했습니다.
내가 할 수 있다는 걸 알아
..//
let fun: fn(value: i32) -> i32;
fun = funTest;
fun(5i32);
..//
fn funTest(value: i32) -> i32 {
println!("{}", value);
value
}
그러나 함수를 다른 함수에 매개 변수로 전달하는 것은 아닙니다.
..//
fn funTest(value: i32, (some_function_prototype)) -> i32 {
println!("{}", value);
value
}
물론 넌 할 수있어:
fn funTest(value: i32, f: &Fn(i32) -> i32) -> i32 {
println!("{}", f(value));
value
}
fn times2(value: i32) -> i32 {
2 * value
}
fn main() {
funTest(5, ×2);
}
하지만 이것은 Rust이므로 클로저 의 소유권과 수명 을 고려해야합니다 .
TL; DR; 기본적으로 3 가지 유형의 클로저 (호출 가능한 객체)가 있습니다.
Fn
: 가장 일반적인 것은 순수한 기능입니다.FnMut
: 캡처 한 객체를 수정할 수 있습니다.FnOnce
: 가장 제한적입니다. 호출 될 때 자신과 캡처를 소비하므로 한 번만 호출 할 수 있습니다.
클로저와 같은 간단한 함수 포인터를 사용하는 경우 캡처 세트가 비어 있고 Fn
맛 이 있습니다.
더 멋진 일을하고 싶다면 람다 함수를 사용해야합니다.
업데이트 : Rust를 배우는 데 더 많은 시간을 보낸 후이 답변을 조금 수정하고 싶은 충동이 필요합니다.
Rust에는 C 에서처럼 작동하는 함수에 대한 적절한 포인터가 있습니다. 그 유형은 예를 들어 fn(i32) -> i32
. Fn(i32) -> i32
, FnMut(i32) -> i32
그리고 FnOnce(i32) -> i32
실제로 특징이다. 분명히 함수에 대한 포인터는 항상이 세 가지를 모두 구현하지만, Rust는 또한 함수에 대한 포인터 (캡처 세트가 비어 있는지 여부에 따라)로 변환 될 수도 있고 변환되지 않을 수도 있지만 이러한 특성 중 일부를 구현합니다.
예를 들어 위의 예를 확장 할 수 있으며 스타일을 약간 수정할 수 있습니다.
fn fun_test_impl(value: i32, f: impl Fn(i32) -> i32) -> i32 {
println!("{}", f(value));
value
}
fn fun_test_dyn(value: i32, f: &dyn Fn(i32) -> i32) -> i32 {
println!("{}", f(value));
value
}
fn fun_test_ptr(value: i32, f: fn(i32) -> i32) -> i32 {
println!("{}", f(value));
value
}
fn times2(value: i32) -> i32 {
2 * value
}
fn main() {
let y = 2;
//static dispatch
fun_test_impl(5, times2);
fun_test_impl(5, |x| 2*x);
fun_test_impl(5, |x| y*x);
//dynamic dispatch
fun_test_dyn(5, ×2);
fun_test_dyn(5, &|x| 2*x);
fun_test_dyn(5, &|x| y*x);
//C-like pointer to function
fun_test_ptr(5, times2);
fun_test_ptr(5, |x| 2*x); //ok: empty capture set
fun_test_ptr(5, |x| y*x); //error: expected fn pointer, found closure
}
Fn
, FnMut
and FnOnce
, outlined in the other answer, are closure types. The types of functions that close over their scope.
Apart from passing closures Rust also supports passing simple (non-closure) functions, like this:
fn times2(value: i32) -> i32 {
2 * value
}
fn fun_test(value: i32, f: fn(i32) -> i32) -> i32 {
println!("{}", f (value));
value
}
fn main() {
fun_test (2, times2);
}
fn(i32) -> i32
here is a function pointer type.
If you don't need a full-fledged closure than working with function types is often simpler as it doesn't have to deal with those closure lifetime nicities.
ReferenceURL : https://stackoverflow.com/questions/36390665/in-rust-how-do-you-pass-a-function-as-a-parameter
'programing' 카테고리의 다른 글
Node.js 형식의 콘솔 출력 (0) | 2021.01.14 |
---|---|
RStudio의 모든 플롯을 지우는 코드 (0) | 2021.01.14 |
ASP MVC 쿠키가 유지되지 않음 (0) | 2021.01.14 |
C ++ 출력 연산자로 선행 0을 인쇄 하시겠습니까? (0) | 2021.01.14 |
선택 상자 유효성 검사 (0) | 2021.01.14 |