vector - 在 Rust 枚举/结构中接受 slice 和 Vec

标签 vector rust slice

我有一些类似的代码

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,
        }
    }
}

playground

关于vector - 在 Rust 枚举/结构中接受 slice 和 Vec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56801339/

相关文章:

c++ - 在调整大小时禁用 vector 填充值? C++

c++ - 如何连接/合并 vector

rust - 为什么使用 rustc 命令构建看不到 crate?

rust - 如何使用 BTreeSet 的自定义比较器函数?

xml - 如何从不在重复项中使用结束标记的嵌套 xml 中获取数据?

string - R使用 “”将字符串转换为向量标记化

C++ 分配 vector 指针

compiler-errors - 如何保证const变量不会发生溢出?

go - 就地更改函数内的 slice 内容和容量

python - Pandas DatetimeIndex 截断错误