【发布时间】:2022-01-06 11:09:08
【问题描述】:
我正在学习 Rust 并且遇到了以下问题,这对我来说并不明显。 我在库中看到了一个 std::thread::spawn,查看了实现,发现某些类型需要实现 Send 特征才能将某些内容发送到另一个线程。 我试图用我自己的函数和我自己的特征来复制行为,但是编译器成功地编译了代码,而没有抱怨我的类型没有实现特征。 我错过了什么?
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);
foo(move || {
println!("{:?}", without_trait);
println!("{:?}", x);
with_trait
});
}
【问题讨论】: