【发布时间】:2019-11-10 02:00:37
【问题描述】:
我有一些类似的代码
enum Value<'a> {
Int(i64),
Flt(f64),
Vec(&'a [Value<'a>]),
}
这让我可以重用一些数据;但是,有时我想接受堆分配的数据,所以我需要这样的东西
enum Value {
Int(i64),
Flt(f64),
Vec(Box<Vec<Value>>),
}
但现在我不能接受切片!我知道我总是可以将它们都放在同一个枚举中,就像这样
enum Value<'a> {
Int(i64),
Flt(f64),
VecSlice(&'a [Value<'a>]),
VecBox(Box<Vec<Value<'a>>>),
}
但这很丑。
有没有办法让结构或枚举在同一成员/变体中同时接受切片和向量?
我知道对于接受 &str 和 String 的函数,我们可以将参数设置为 T: Into<String> 之类的东西,但我还没有弄清楚如何对数据类型中的向量执行类似的操作。
【问题讨论】:
-
Box<Vec<Value>>框向量没有意义 -
@Stargateur 好吧,如果枚举中的向量未装箱,则枚举大小将为 32 字节,而不是装箱时的 16 字节。这在某些情况下可能很重要
-
play.integer32.com/…,我没看到你的问题
-
@Stargateur 你是对的!我只是尝试从一个函数返回一个未装箱的向量,一切正常。问题是我没有指定向量的生命周期,因此没有指定
Box。谢谢你:) -
我不认为 slice 需要胖指针和 enum 也需要一些空间,注意不要太担心,代码,看看是否有问题。