我有一些代码需要接受数据结构列表,这些数据结构可以是多种不同类型中的任何一种,但都实现了Into<SomeType>
. 所以,我说参数是impl IntoIterator<Item = Into<SomeType>>
,我就完成了。除了...
我似乎无法以简洁的方式指定“空列表”。
我是不是搞砸了,每个人都必须使用丑陋的语法(Vec::<impl Into<SomeType>>::new()
),或者是否有一个我以前没有遇到过的简单选项?
下面是演示该问题的示例代码(也在Playground 中):
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>
,但这是神秘的一面。您可以为元素类型添加通用参数:这意味着这
takes_iterable_arrays::<&str>([])
是一个有效的调用。如果调用者自己处理通用迭代器返回类型,它还可以帮助调用者约束项目类型。