我正在尝试实现一个队列,生产者可以在其中添加一个实现 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)
您已经使用了铸造,as_trait
但只是为了使其更清晰。可以使用关键字将对象转换为特征as
:
use std::sync::Arc;
struct MyStruct;
trait MyTrait {}
impl MyTrait for MyStruct {}
fn main() {
let my_struct: MyStruct = MyStruct;
// behind a reference
let trait_object: &dyn MyTrait = &MyStruct as &dyn MyTrait;
// behind a box
let trait_object: Box<dyn MyTrait> = Box::new(MyStruct) as Box<dyn MyTrait>;
// behind an Arc
let trait_object: Arc<dyn MyTrait> = Arc::new(MyStruct) as Arc<dyn MyTrait>;
// behind an Arc Box
// DOESN'T COMPILE!
let trait_object: Arc<Box<dyn MyTrait>> = Arc::new(Box::new(MyStruct)) as Arc<Box<dyn MyTrait>>;
}
Run Code Online (Sandbox Code Playgroud)
Arc
但它在两个间接寻址(例如和 )后面不起作用Box
。
你的整个设置对我来说似乎非常复杂。正如 @kmdreko 所指出的,使用Arc
似乎有效。您应该重新思考您的程序想要做什么并想出一种更简单的方法。
归档时间: |
|
查看次数: |
4574 次 |
最近记录: |