如何在特征对象和实现特征的结构类型之间进行转换

时间:2018-09-24 23:10:16

标签: rust type-conversion traits

到目前为止,这是我一直尝试的结果,但实际上并没有解决。我的意思是要有一个通用函数,该函数将带有一个类型参数和一个自变量,即Behaviour的特征对象,并将该类型作为要转换为类型参数中的类型的行为对象返回。此外,我曾考虑过在运行时使用模式匹配,只有在类型匹配时才会产生输出,但是我遇到了<&Behaviour><T>之间类型不匹配的错误。

pub trait Behaviour: BehaviourAgent {
    fn set(&mut self) -> ();
}

pub trait BehaviourAgent {
    fn clone_agent(&self) -> Box<Behaviour>;
    // fn revert<_type>(&self) -> _type;
}

impl<Type> BehaviourAgent for Type where Type: 'static + Behaviour + Clone, {
    fn clone_agent(&self) -> Box<Behaviour> {
        return Box::new(self.clone());
    }
}

impl Clone for Box<Behaviour> {
    fn clone(&self) -> Box<Behaviour> {
        return self.clone_agent();
    }
}

pub trait TypeRevert<Type> {
    fn revert(&mut self) -> Type;
}

// impl<Type> TypeRevert<Type> for & 'static Behaviour {
//  fn revert(&mut self) -> Type {
//      unsafe { return self.clone(); }
//  }
// }

impl<Type> TypeRevert<Type> for Type where Type: 'static + Behaviour + Clone {
    fn revert(&mut self) -> Type {
        return self.clone();
    }
}

#[derive(Clone, Copy)]
pub struct SoundDevice {/*attributes*/}

impl Behaviour for SoundDevice {
    fn set(&mut self) -> () { }
}

fn main() {
    let target: Box<Behaviour> = Box::new(SoundDevice { });
    // let mut test_obj: SoundDevice = TypeRevert::revert(&mut *(target.clone()));
    let mut test_obj: SoundDevice = TypeRevert::<SoundDevice>::revert(&mut *(target.clone()));
}

0 个答案:

没有答案