我有一些类似的代码
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>
的值但我还没有想出如何对数据类型内部的向量做这样的事情。
最佳答案
你要的是Cow
:
enum Value<'a> {
Int (i64),
Flt (f64),
Vec (Cow<'a, [Value<'a>]>),
}
不幸的是,由于 #38962 这不起作用.在该问题得到解决之前,您可能需要为 Value
重新实现 Cow
的专用版本:
enum MyCow<'a> {
Borrowed (&'a[Value<'a>]),
Owned (Vec<Value<'a>>)
}
impl<'a> Deref for MyCow<'a> {
type Target = [Value<'a>];
fn deref (&self) -> &[Value<'a>] {
use crate::MyCow::{ Borrowed, Owned };
match *self {
Borrowed (borrowed) => borrowed,
Owned (ref owned) => &owned,
}
}
}
关于vector - 在 Rust 枚举/结构中接受 slice 和 Vec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56801339/