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,>
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 paraStructWithTrait
y no paraStructWithoutTrait
. Por lo tanto, es posible que el compilador no esté detectando un error porquefoo()
solo se llama con un cierre que devuelve una instancia deStructWithTrait
, que sí implementaSomeTrait
.Para probar si el problema se debe a la falta de implementación de
SomeTrait
paraStructWithoutTrait
, intenta agregarimpl 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.