Vector 如何实现包含自身向量的Cow的枚举?
我是。到目前为止,我所做的就是:Vector 如何实现包含自身向量的Cow的枚举?,vector,enums,rust,Vector,Enums,Rust,我是。到目前为止,我所做的就是: use std::borrow::Cow; pub struct Float { pub min: f64, pub max: f64, pub value: f64, } pub struct Text<'a> { pub value: Cow<'a, str> } pub enum Value<'a> { None, Float(Float), Text(Tex
use std::borrow::Cow;
pub struct Float {
pub min: f64,
pub max: f64,
pub value: f64,
}
pub struct Text<'a> {
pub value: Cow<'a, str>
}
pub enum Value<'a> {
None,
Float(Float),
Text(Text<'a>),
}
这使我可以在以下功能中使用它:
fn append_string(s1: &Value, s2: &Value) {
Value::Text(Text {
value: format!("{}{}", s1.str_val(), s2.str_val()),
})
}
我希望向量也是这样,我假设如下:
pub fn vec(&'a self) -> Vec<Value> {
match self {
Value::Vector(v) => v.value,
_ => Cow::Owned(Vector { value: vec![] }),
}
}
pub fn vec(&'a self) -> Vec<Value> {
match self {
Value::Vector(v) => v.value,
_ => Cow::Owned(Vector { value: vec![] }),
}
}
pub-fn-vec(&'a-self)->vec{
匹配自我{
值::向量(v)=>v.Value,
_=>Cow::Owned(向量{value:vec![]}),
}
}
我希望向量也是这样,我假设如下:
pub fn vec(&'a self) -> Vec<Value> {
match self {
Value::Vector(v) => v.value,
_ => Cow::Owned(Vector { value: vec![] }),
}
}
pub fn vec(&'a self) -> Vec<Value> {
match self {
Value::Vector(v) => v.value,
_ => Cow::Owned(Vector { value: vec![] }),
}
}
然后,您的to_vec
将如下所示:
impl<'a> Value<'a> {
pub fn to_vec(&'a self) -> Cow<'a, [Value<'a>]> {
match self {
Value::Vector(v) => Cow::Borrowed(&v.value),
_ => Cow::Owned(Vec::new()),
}
}
}
impl<'a> Value<'a> {
pub fn to_vec_slice(&'a self) -> &'a [Value<'a>] {
match self {
Value::Vector(v) => &v.value,
_ => &[],
}
}
}
我希望向量也是这样,我假设如下:
pub fn vec(&'a self) -> Vec<Value> {
match self {
Value::Vector(v) => v.value,
_ => Cow::Owned(Vector { value: vec![] }),
}
}
pub fn vec(&'a self) -> Vec<Value> {
match self {
Value::Vector(v) => v.value,
_ => Cow::Owned(Vector { value: vec![] }),
}
}
然后,您的to_vec
将如下所示:
impl<'a> Value<'a> {
pub fn to_vec(&'a self) -> Cow<'a, [Value<'a>]> {
match self {
Value::Vector(v) => Cow::Borrowed(&v.value),
_ => Cow::Owned(Vec::new()),
}
}
}
impl<'a> Value<'a> {
pub fn to_vec_slice(&'a self) -> &'a [Value<'a>] {
match self {
Value::Vector(v) => &v.value,
_ => &[],
}
}
}
@Hellagot我相信您可以使用返回
Cow
s的函数,而不必将Cow
s存储在Value
中。在结构/枚举中使用Cow
,可以存储拥有的值或借用的值;你真的需要吗?用Rc
或Arc
代替怎么样?@HellagotCow>
有点奇怪。您可能想要Cow]>,它在借用时是一个切片,在拥有时是一个
Vec`。但问题的根源是,Cow
需要T:Toowed
才能创建一个拥有的变体。它之所以建议使用Clone
,是因为对于所有类型的Clone
,都有一个全面的ToOwned
实现。但这并不一定是你想要的。如果你试图为Value
或[Value]
自己实现ToOwned
,你会发现自己需要在某处进行克隆。@PeterHall不会Vec
和[]
在这里提供间接寻址吗?@Hellagot我相信您可以使用返回Cow
s的函数,而无需将Cow
s存储在值中。在结构/枚举中使用Cow
,可以存储拥有的值或借用的值;你真的需要吗?用Rc
或Arc
代替怎么样?@HellagotCow>
有点奇怪。您可能想要Cow]>,它在借用时是一个切片,在拥有时是一个
Vec`。但问题的根源是,Cow
需要T:Toowed
才能创建一个拥有的变体。它之所以建议使用Clone
,是因为对于所有类型的Clone
,都有一个全面的ToOwned
实现。但这并不一定是你想要的。如果你尝试为Value
或[Value]
自己实现ToOwned
,你会发现自己需要在某处进行克隆。@PeterHall不Vec
和[]
在这里提供间接定向?Cow]>
和&a[Value Cow]>
和fn to_-vec(&self)->&[价值尽管如此,我想统一生命周期可能是有意的?如果一切都是不变的,它会起作用。@trentcl不,我只是有点懒。这可能仍然是OP想要的。很难说清楚。OP的stru_val
出于同样的原因是可疑的。谢谢大家,切片版本是我一直在寻找的,还在学习中。目前,我希望保持源代码值不变,但我将尽可能删除返回的生存期,让编译器省略它,正如@trentclCow]>
和&a[Value Cow]>
和fn to_vec(&self)->所建议的那样&[价值尽管如此,我想统一生命周期可能是有意的?如果一切都是不变的,它会起作用。@trentcl不,我只是有点懒。这可能仍然是OP想要的。很难说清楚。OP的stru_val
出于同样的原因是可疑的。谢谢大家,切片版本是我一直在寻找的,还在学习中。目前,我希望保持源代码值不变,但我将尽可能删除返回的生存期,让编译器删除它,正如@trentcl所建议的那样