将空列表传递给采用特征迭代器的函数

问题描述 投票:0回答:1

我有一些代码需要接受数据结构列表,这些数据结构可以是多种不同类型中的任何一种,但都实现了

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([]); }
注释掉的行是我尝试过的变体,我想使用它们,但不起作用。

rust types iterator traits
1个回答
0
投票
在不指定元素类型的情况下不可能提供“空列表”,因为即使没有元素,

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>([])

 是一个有效的调用。如果调用者自己处理通用迭代器返回类型,它还可以帮助调用者约束项目类型。

© www.soinside.com 2019 - 2024. All rights reserved.