到目前为止,这是我一直尝试的结果,但实际上并没有解决。我的意思是要有一个通用函数,该函数将带有一个类型参数和一个自变量,即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()));
}