如何将文字值转换为特征对象?

时间:2016-07-10 18:00:18

标签: rust

我试图让这段代码更简洁,并摆脱冗余变量。是否可以这样做?

trait Foo {}
impl Foo for i32 {}
impl Foo for String {}

fn main() {
    let xi32: i32 = 10;
    let y = String::from("ooo");
    let mut foo_list: Vec<&Foo> = vec![];
    foo_list.push(&xi32 as &Foo);
    foo_list.push(&y as &Foo);
}

以下变体不起作用:

foo_list.push(10 as Foo);
error[E0620]: cast to unsized type: `{integer}` as `Foo`
  --> src/main.rs:11:19
   |
11 |     foo_list.push(10 as Foo);
   |                   ^^^^^^^^^
   |
help: consider using a box or reference as appropriate
  --> src/main.rs:11:19
   |
11 |     foo_list.push(10 as Foo);
   |                   ^^

2 个答案:

答案 0 :(得分:7)

Rust允许您引用临时文件:

foo_list.push(&10 as &Foo);

这段确切的代码不会工作until Rust 1.21,其中文字值10会自动提升为静态值,然后会引用它。

在Rust 1.21之前,临时不再存在于语句的末尾,因此您最终会在向量中使用悬空引用。因此,必须使用变量来延长值的生命周期。

答案 1 :(得分:5)

您可以使用盒装特征对象在向量中存储值:

let mut box_list: Vec<Box<Foo>> = vec![];
box_list.push(Box::new(42));
box_list.push(Box::new("forty two".to_owned()));