当尝试从match
语句中创建继承特征的对象时,我发现有必要为匹配的每种类型的对象定义不同的外部变量。有必要在匹配之外声明变量,以便声明不会超出范围。
由于Trt
未标注,因此无法使用Trt
类型的单个外部变量。有没有办法让匹配返回一个实现Trt
的对象而不回复这种提前定义大量变量的丑陋方法?
以下是问题的一个示例:
enum Enm {
X1,
X2,
X3
}
trait Trt {
fn foo(&self) -> &'static str;
}
struct A{}
impl Trt for A{
fn foo(&self) -> &'static str { "A" }
}
struct B{}
impl Trt for B{
fn foo(&self) -> &'static str { "B" }
}
struct C{}
impl Trt for C{
fn foo(&self) -> &'static str { "C" }
}
fn main() {
let x = Enm::X3;
let mut temp;
let mut temp2;
let mut temp3;
let gen = match x {
Enm::X1 => {
temp = A{};
&mut temp as &mut Trt
},
Enm::X2 => {
temp2 = B{};
&mut temp2 as &mut Trt
},
Enm::X3 => {
temp3 = C{};
&mut temp3 as &mut Trt
},
};
println!("{}", gen.foo());
}
答案 0 :(得分:2)
您创建的对象需要拥有所有者。普通参考&
不能是所有者,这就是您需要在代码中temp
/ temp2
/ temp3
作为您在{{1}中创建的对象的所有者的原因武器。
拥有特质对象的最简单方法是使用match
,如下所示:
Box
在匹配子句之后,现在// definitions omitted...
fn main() {
let x = Enm::X3;
let gen = match x {
Enm::X1 => {
Box::new(A{}) as Box<Trt>
},
Enm::X2 => {
Box::new(B{}) as Box<Trt>
},
Enm::X3 => {
Box::new(C{}) as Box<Trt>
},
};
println!("{}", gen.foo());
}
拥有创建的特征对象,因此您不必再定义临时对象。