我有一些代码需要接受数据结构列表,这些数据结构可以是多种不同类型中的任何一种,但都实现了
Into<SomeType>
。所以,我说参数是impl IntoIterator<Item = Into<SomeType>>
,我就完成了。除了...
我似乎无法以简洁的方式指定“空列表”。
我搞砸了,每个人都必须使用丑陋的语法(
Vec::<impl Into<SomeType>>::new()
),还是有一个我以前没有遇到过的简单选项?
这是演示该问题的示例代码(也在操场上):
fn takes_iterable_arrays(ia: impl IntoIterator<Item = impl Into<String> + std::fmt::Debug>) {
println!("{:?}", ia.into_iter().collect::<Vec<_>>());
}
fn main() {
takes_iterable_arrays(vec!["foo", "bar"]);
takes_iterable_arrays(Vec::<String>::new());
takes_iterable_arrays(Vec::<&str>::new());
//takes_iterable_arrays(vec![]);
//takes_iterable_arrays(&[]);
//takes_iterable_arrays([]);
}
注释掉的行是我尝试过的变体,我想使用它们,但不起作用。
takes_iterable_arrays()
size_of()
或
type_name_of()
)。因此,您所使用的语法与您已经使用的语法大致相同。也许您可以使用的最短的空
IntoIterator
是
None::<&str>
,但这是神秘的一面。您可以为元素类型添加通用参数:
fn takes_iterable_arrays<T>(ia: impl IntoIterator<Item = T>)
where
T: Into<String> + std::fmt::Debug,
{
println!("{:?}", ia.into_iter().collect::<Vec<_>>());
}
这意味着 takes_iterable_arrays::<&str>([])
是一个有效的调用。如果调用者自己处理通用迭代器返回类型,它还可以帮助调用者约束项目类型。