vector - 在 Rust 枚举/结构中同时接受 slice 和 Vec
问题描述
我有一些类似的代码
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这不起作用。在解决该问题之前,您可能需要重新实现Cow
for的专用版本Value
:
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,
}
}
}
推荐阅读
- javascript - 有条件避免在文本区域内复制文本不起作用
- javascript - 如何在一个端点上同时使用 moxios 和 supertest 的请求,该端点有 2 个 axios 请求,一个需要存根,一个不需要存根?
- r - R:创建一个序列减去和添加一个数字到单个列表(或向量)中
- javascript - JavaScript 事件处理代码被多次调用
- python - 字符串的正则表达式问题结束,直到一个带有 python 的符号
- c++ - C++ 将一个对象从另一个类传递给另一个对象
- c# - 从实时数据库中获取 json 数据
- ruby-on-rails-6 - 使用 jquery 在 Ruby on Rails 6 上显示星级时出现问题。星星不出现
- python - 尝试运行python程序时出现内存错误
- git - GitHub pre-receive hook 显示警告信息