variable una programacion pasar otra llamar funciones funcion evaluar entre dentro crear como comando function parameter-passing rust

function - programacion - Cómo pasar una función como argumento en Rust



pasar variable de una funcion a otra php (1)

Dado el siguiente programa de óxido:

fn call_twice<A>(val: A, f: fn(A) -> A) -> A { f(f(val)) } fn main() { fn double(x: int) -> int {x + x}; println!("Res is {}", call_twice(10i, double)); // println!("Res is {}", call_twice(10i, (x: int) -> int {x + x})); // ^ this line will fail }

¿Por qué puedo pasar double como la función, pero no en línea? ¿Cuál es una buena manera de lograr el mismo comportamiento sin definir la función en algún lugar?


Actualización 2016-04-01:

A partir de Rust 1.0, el código debería verse así:

fn call_twice<A, F>(val: A, mut f: F) -> A where F: FnMut(A) -> A { let tmp = f(val); f(tmp) } fn main() { fn double(x: i32) -> i32 {x + x}; println!("Res is {}", call_twice(10, double)); println!("Res is {}", call_twice(10, |x| x + x)); }

El cambio en el parámetro de cierre se debe a que el cierre ahora está desagrupado.

Original:

En la medida en que sé, no puede definir funciones en línea así.

Lo que quieres es un cierre. Los siguientes trabajos:

fn call_twice<A>(val: A, f: |A| -> A) -> A { let tmp = f(val); f(tmp) } fn main() { fn double(x: int) -> int {x + x}; println!("Res is {}", call_twice(10i, double)); println!("Res is {}", call_twice(10i, |x| x + x)); }

Hay algunas cosas a tener en cuenta:

  1. Las funciones obligan a los cierres, pero lo contrario no es cierto.

  2. Necesita almacenar el resultado de f(val) de forma temporal debido a las reglas de endeudamiento. Versión corta: necesita acceso exclusivo a un cierre para llamarlo, y el comprobador de préstamos no es lo suficientemente inteligente como para darse cuenta de que las dos llamadas son independientes en sus posiciones originales.

  3. Los cierres están en proceso de ser reemplazados por cierres sin caja , por lo que esto cambiará en el futuro, pero todavía no hemos llegado.