没有继承的不同事物列表?

Lar*_*äck 0 rust

我知道如何使用像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中实现这一目标?

Man*_*rth 6

这与继承无关; 类型[&'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>>.