Equivalencia desde Kotlin
Comportamiento como valor
CercanaRust representa las closures mediante tipos propios y expresa la capacidad de invocarlas con los traits Fn, FnMut o FnOnce. Un límite genérico evita fijar una representación única.
Referencia Kotlin: Declarar una operación reutilizable y recibir otra operación como valor.
- Mecanismo
- Una función genérica restringida por el trait
Fn(i32) -> i32. - Idea conservada
- La transformación se recibe como valor y se invoca dos veces sobre el mismo argumento; quien la declara no necesita conocer
apply_twice. - Riesgo de diseño
- Elegir
Fnpara una closure que debe consumir una captura; en ese caso la frontera puede requerirFnOnce.
- Recomendación
- Elige el límite menos restrictivo que comunique cómo la función invocará la closure.
- Convención del curso
- Elige el trait menos restrictivo (
Fnantes queFnMutoFnOnce) que describa cómo se invoca la closure.
- Mecanismo del lenguaje
- Closures y los traits
Fn,FnMutyFnOnce.
Diferencias relevantes
- La closure puede capturar valores por préstamo, préstamo mutable o movimiento; eso afecta el trait que la API acepta.
Fnrequiere poder llamar la closure sin consumirla ni mutarla.
El trait Fn expresa cómo puede invocarse la transformación recibida.
fun applyTwice(
value: Int,
transform: (Int) -> Int,
): Int = transform(transform(value))
val result = applyTwice(3) { it + 1 } // 5fn apply_twice<F>(value: i32, transform: F) -> i32
where
F: Fn(i32) -> i32,
{
transform(transform(value))
}
let result = apply_twice(3, |number| number + 1); // 5Otra forma de recibir comportamiento: un predicado para filtrar un slice.
fn keep(xs: &[i32], p: impl Fn(i32) -> bool) -> Vec<i32> {
xs.iter().copied().filter(p).collect()
}