我正在尝试编写一个函数,该函数接受泛型类型的任何可迭代对象作为输入,并在元素上循环。
pub fn test1<'a, IterableT, ItemT>(nodes: &'a IterableT)
where
&'a IterableT: IntoIterator<Item = &'a ItemT>,
ItemT: 'a + Debug
{
for x in nodes {
println!("consuming or iterating: {:?}!", x);
}
}
字符串
这适用于引用类型。我努力实现一个既适用于常规类型又适用于引用的版本。
pub fn test1<IterableT>(nodes: IterableT)
where
IterableT: IntoIterator,
IterableT::Item: Debug
{
for x in nodes {
println!("consuming or iterating: {:?}!", x);
}
}
型
只要我使用的类型的引用版本实现了IntoIterator(例如vec
、&vec
和&mut vec
),这就可以工作。问题是我不能重新引入ItemT
泛型,因为基础Item
被缩小到Item
或&Item
之一
pub fn test1<IterableT, ItemT>(nodes: IterableT)
where
IterableT: IntoIterator<Item = ItemT>, // alternatively IntoIterator<Item = &ItemT>
ItemT: Debug
{
for x in nodes {
println!("consuming or iterating: {:?}!", x);
}
}
型
取决于我使用的是IntoIterator<Item = ItemT>
还是IntoIterator<Item = &ItemT>
,这适用于vec
或&vec
,但不能同时适用。一个简单的解决方法是指定IterableT::Item: Into<ItemT>
,但这只有在底层类型实现Into traits时才有效(因此这将适用于内置类型,如i32,i64,但不适用于某些自定义结构)。
有没有一种方法可以在where
子句中指明Item
可以是ItemT
或&ItemT
?我需要引入ItemT
的原因是因为它是父结构的泛型变量,这个函数是它的一部分。我需要接受特定类型的迭代器。
1条答案
按热度按时间9jyewag01#
您可以使用
std::borrow::Borrow
将T
和&T
视为相同。字符串
实际:
型
输出量:
型
注意,因为
Borrow
trait有一个type参数,所以你必须在调用站点显式地为T
提供正确的类型; Rust将无法推断出你想要的类型。