是否可以将 an 映射Option<impl Trait>到 a Option<Box<dyn Trait>>?如果 的参数new()不是 an Option,则可以将其分配给structwith Some(Box::new(item))。为什么这个可以用而地图却不行?
trait TestTrait {}
impl TestTrait for i32 {}
struct TestStruct {
item: Option<Box<dyn TestTrait>>
}
impl TestStruct {
pub fn new(item: Option<impl TestTrait + 'static>) -> Self {
let item: Option<Box<dyn TestTrait>> = item.map(|i| Box::new(i));
Self {
item
}
}
}
fn main() {
let num:i32 = 0;
let s = TestStruct::new(Some(num));
}
Run Code Online (Sandbox Code Playgroud) 我试图在创建结构和删除结构时记录结构地址,当我运行以下代码时,不仅两个结构都记录相同的地址,而且两个结构在删除时都记录不同的地址。有没有正确的方法来做到这一点?
struct TestStruct {
val: i32
}
impl TestStruct {
fn new(val: i32) -> Self {
let x = TestStruct{val};
println!("creating struct {:p}", &x as *const _);
x
}
}
impl Drop for TestStruct {
fn drop(&mut self) {
println!("destroying struct {:p}", &self as *const _)
}
}
fn main() {
let s1 = TestStruct::new(1);
let s2 = TestStruct::new(2);
}
Run Code Online (Sandbox Code Playgroud)
输出:
creating struct 0x7ffef1f96e44
creating struct 0x7ffef1f96e44
destroying struct 0x7ffef1f96e38
destroying struct 0x7ffef1f96e38
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个队列,生产者可以在其中添加一个实现 QueueTrait 的结构,并且当出队时,将在不同的线程上调用该特征的调用方法。由于以下错误,因此无法编译:
self.queue.enqueue(self.data);
^^^^^^^^^ expected trait object `dyn QueueTrait`, found struct `ProducerData`
expected struct `std::sync::Arc<std::boxed::Box<dyn QueueTrait + std::marker::Send>>`
found struct `std::sync::Arc<std::boxed::Box<ProducerData>>
Run Code Online (Sandbox Code Playgroud)
是否可以将 ProducerData 转换为 QueueTrait?有没有什么方法可以避免将 Producer 完全拆分为 ProducerData ,而只需将 Producer 本身添加到队列中?
self.queue.enqueue(self.data);
^^^^^^^^^ expected trait object `dyn QueueTrait`, found struct `ProducerData`
expected struct `std::sync::Arc<std::boxed::Box<dyn QueueTrait + std::marker::Send>>`
found struct `std::sync::Arc<std::boxed::Box<ProducerData>>
Run Code Online (Sandbox Code Playgroud) rust ×3