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.

Copiando el comportamiento de std::thread::spawn y Send, pero con un rasgo y una función diferente.

Estoy aprendiendo Rust y me he encontrado con el siguiente problema, que no es obvio para mí.
Vi un std::thread::spawn en la biblioteca, miré la implementación y vi que algún tipo requiere una implementación del rasgo Send para poder enviar algo a otro hilo.
Estoy tratando de replicar el comportamiento con mi propia función y mi propio rasgo, pero el compilador compila correctamente el código sin quejarse de que el rasgo no está implementado para mis tipos.
¿Qué me estoy perdiendo?

“`rust
pub trait SomeTrait {
fn bar(&self);
}

#[derive(Debug)]
struct StructWithoutTrait {
_data: Box<i32>,
}

#[derive(Debug)]
struct StructWithTrait {
_data: Box<i32>,
}

impl SomeTrait for StructWithTrait {
fn bar(&self) {}
}

fn foo<f, t="">(f: F) -> T
where
F: FnOnce() -> T,
F: SomeTrait + 'static,
T: SomeTrait + 'static
{
f.bar();
f()
}

impl<f, t=""> SomeTrait for F
where
F: FnOnce() -> T,
T: SomeTrait
{
fn bar(&self) {}
}

fn main() {
let without_trait = StructWithoutTrait { _data: Box::new(1) };
let with_trait = StructWithTrait { _data: Box::new(2) };
let x = std::rc::Rc::new(1);

<pre><code>foo(move || {
println!("{:?}", without_trait);
println!("{:?}", x);
with_trait
});
</code></pre>

}
“`</f,></f,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Basándose en el código proporcionado, parece que el problema podría ser debido al hecho de que el rasgo SomeTrait solo está implementado para StructWithTrait y no para StructWithoutTrait. Por lo tanto, es posible que el compilador no esté detectando un error porque foo() solo se llama con un cierre que devuelve una instancia de StructWithTrait, que sí implementa SomeTrait.

    Para probar si el problema se debe a la falta de implementación de SomeTrait para StructWithoutTrait, intenta agregar impl SomeTrait for StructWithoutTrait y verifica si el compilador indica un error.

    Además, vale la pena mencionar que el rasgo Send mencionado en el problema original no se utiliza en el código proporcionado, por lo que puede que no sea relevante para el problema en cuestión.

Comments are closed.