【问题标题】:How do I cast a literal value to a trait object?如何将文字值转换为特征对象?
【发布时间】:2016-07-10 18:00:17
【问题描述】:

我试图让这段代码更简洁,并去掉多余的变量。有可能吗?

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);
   |                   ^^

【问题讨论】:

    标签: rust


    【解决方案1】:

    Rust 允许你引用一个临时的:

    foo_list.push(&10 as &Foo);
    

    这个确切的代码不起作用until Rust 1.21,其中文字值10 会自动提升为静态值,然后对其进行引用。

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-01
      • 2019-10-23
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 2018-08-19
      相关资源
      最近更新 更多