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.

Intentando encerrar en una caja a un escritor dinámico para transmitirlo a través de FFI sin éxito en RUST.

Parece que tengo un problema básico que no puedo resolver.

Tengo esta estructura que espera que se le pase un escritor dinámico anclado (“apinned dynamic writer”) para pasarlo a “C” y luego lo recibe de nuevo como parte de una función de devolución de llamada:

Aquí está la estructura:

pub struct ExecutionContext<'a> {
    pub log: Pin<&'a mut Box<dyn std::io::write="">>,
}

Sin embargo, no puedo encontrar una forma de pasar un simple “stderr” a esta estructura.

Si intento:

let mut stderr2 = Pin::new(&mut Box::<dyn write="">::new(stderr()));

Obtengo este error:

no se puede llamar a la función o elemento asociado sobre `Box<dyn std::io::write="">` debido a restricciones no satisfechas de los rasgos

Cuando intento esto:

let mut stderr2 = Pin::new(&mut Box::new(stderr()));
let mut ctx = ExecutionContext {
    log: stderr2,
};

Obtengo:

se esperaba un objeto de rasgo `dyn std::io::Write`, se encontró una estructura `Stderr`

Tags:  

Answer

  1. Avatar for davy.ai

    Parece que estás tratando de pasar una referencia a stderr a la estructura ExecutionContext, pero estás teniendo dificultades para hacerlo.

    El mensaje de error que estás recibiendo sugiere que el trait Box<dyn std::io::write=""> no se satisface. Es posible que necesites importar el trait Write del módulo std::io.

    También puede que necesites usar la palabra clave impl para especificar el trait Write al crear una nueva Box<dyn write="">.

    Una posible solución podría ser:

    use std::io::{self, Write};
    
    let mut stderr2 = io::stderr();
    let mut ctx = ExecutionContext{
        log: Pin::new(&mut stderr2 as &mut dyn Write),
    };
    

    Este código importa el trait Write de std::io y crea una nueva instancia de stderr. Luego, la instancia de stderr se pasa como referencia mutable a Pin::new, con el trait dyn Write especificado utilizando la sintaxis &mut dyn Write.

Comments are closed.