es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Qué permite que un tipo de función de rasgo se pueda utilizar donde se espera un tipo de función?

¿Qué permite que se pueda usar un tipo de rasgo de función (std::ops::Fn) donde se espera un tipo fn (por ejemplo, cierre, definición de función, tipo de puntero fn)?

fn take_closure<f: fn(u32)="" -=""> u32>(f: F) {}

fn id(x: u32) -> u32 {
    x
}

fn main() {
    take_closure(id);
}

¿Es:
– una implementación de Fn para cada tipo fn correspondiente?
– o una coerción, como la que se describe en Fn a fn?

Estoy preguntando más sobre el modelo mental que sobre la implementación concreta.

Edición:

Actualicé el ejemplo, anteriormente el ejemplo mostraba la conversión en la dirección opuesta. Disculpa por eso. He creado una pregunta separada para preguntar sobre la conversión en la dirección opuesta: ¿Qué permite que se pueda usar un tipo de cierre donde se espera un tipo de puntero a función?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El rasgo std::ops::Fn define un método de llamada que es implementado por los closures y los punteros a función. Esto permite que cualquier tipo que implemente std::ops::Fn pueda ser llamado como una función. En Rust, las funciones generalmente se representan como tipos fn, que son diferentes de los closures. Sin embargo, los closures pueden ser coaccionados en tipos de punteros a función, lo que permite que un tipo de rasgo de función (std::ops::Fn) sea utilizado donde se espera un tipo fn.

    En otras palabras, es una coercción similar a la de Fn a fn, que permite que los closures sean utilizados de forma intercambiable con los tipos de puntero a función. Esto hace que sea más flexible pasar funciones como argumentos a otras funciones, ya que el llamador puede usar tanto un closure como un tipo de puntero a función.

Comments are closed.