防止值丢失在通用匹配中

时间:2016-10-25 00:46:15

标签: rust traits

当尝试从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());
}

1 个答案:

答案 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()); } 拥有创建的特征对象,因此您不必再定义临时对象。