我知道如何使用像Java这样的继承语言或像JavaScript这样的无类型语言来制作相关内容的列表,但是我无法弄清楚如何在Rust中做到这一点.这将产生错误,因为Dereference在编译时不知道数组的大小.
#[derive(PartialEq, Eq, PartialOrd, Ord)]
struct Appearance<'a> {
identity: &'a u64,
role: &'a str
}
struct Dereference<'a> {
set: [&'a Appearance<'a>]
}
fn main() {
let r = "hair_color";
let i1 = 42;
let i2 = 43;
let a1 = Appearance{identity: &i1, role: r};
let a2 = Appearance{identity: &i2, role: r};
let d1 = Dereference{set: [&a1]};
let d2 = Dereference{set: [&a1, &a2]};
let list: Vec<Dereference> = vec!(d1, d2);
}
Run Code Online (Sandbox Code Playgroud)
但是,set成员Dereference将是一个小规模的阵列.假设少于32,最常见的是1或2,很少3,并且几乎不是那么大.我可以创建32个结构和32个列表,但为了方便起见,我真的想以更聪明的方式做到这一点.即使我必须创建32个结构,至少有一个列表可以提供很多帮助.我需要它同时具有内存和性能效率.我如何在Rust中实现这一目标?
这与继承无关; 类型[&'a Appearance<'a>]是unsized类型.它只能在指针后面引用,如&[&'a Appearance<'a>]
你可能想要的是什么Vec<&'a Appearance<'a>>.说真的,Vec<Appearance>可能会更好,有#[derive(Copy)]上Appearance,因为Appearance本身是一堆引用,并没有太多的点服用一堆引用的参考.
虽然你的例子没有尝试列出相关的东西,(它只是列出了Appearances),但在Rust中有两种方法可以做到这一点.一个是使用枚举,即你做类似的事情enum Things {Thing1(Type1), Thing2(Type2), ...},然后存储一个Vec<Things>.这避免了额外的分配,但是更多的打字.或者,您可以使用特征对象,通过使用您需要的所有方法定义特征,为相关类型实现特征,以及使用Vec<&TraitName>或Vec<Box<TraitName>>.
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |