I думаю ближайшая вещь к тому, что вы хотите, это черта AsRef
. В частности, Vec<T>
, [T]
и [T;n]
для n <= 32
реализуют AsRef<[T]>
, как и некоторые другие вещи (например, итератор над слайсом). Кроме того, Box<T>
реализует AsRef<T>
, но ваш сценарий Box<Vec<T>>
здесь не совсем подойдет. Хотя, становится немного волосатым с перечислением. Описание типа не совсем работает как:
enum Value<S>
where S: AsRef<[Value<S>]>
{
Int(i64),
Flt(f64),
Slice(S),
}
Потому что вы привержены тому, чтобы создавать только один S
за один раз, и исправление, которое требует использования Box<dyn S>
, чтобы сделать его неоднородным, что становится действительно грязным.
Если вы можете выполнить рефакторинг для выполнения этой работы на функциональном уровне или создать тип более высокого уровня выше Value
, у вас могут быть такие функции, как
fn foo<S>(slice: S) where S: AsRef<[Value]> { }
Довольно легко, однако, с этой конструкцией. В этом случае, если у вас есть Box<Vec<Value>>
, вызов foo(my_vec)
не будет вполне работать, но может быть тривиально исправлен с помощью разыменования, поскольку Box<[T]>
реализует From<Vec<T>>
.
use std::convert::AsRef;
enum Value
{
Int(i64),
Flt(f64),
}
fn main() {
use Value::*;
let x = Box::new(vec![Int(5),Flt(22.5),Int(22)]);
foo(*x)
}
fn foo<S>(slice: S) where S: AsRef<[Value]> {
}
Детская площадка