我试图让这段代码更简洁,并摆脱冗余变量。是否可以这样做?
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);
| ^^
答案 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()));