将结构转换为特征

zma*_*man 1 rust

我正在尝试实现一个队列,生产者可以在其中添加一个实现 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)

Had*_*dus 5

您已经使用了铸造,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似乎有效。您应该重新思考您的程序想要做什么并想出一种更简单的方法。