如何在泛型中指定Iterator类型?

时间:2019-09-17 19:28:05

标签: rust iterator ref borrowing

此问题基于this code from the url crate

extend方法在带有对象的元组上接收一个迭代器,这些对象可能作为&str借用。

fn extend<I, K, V>(iter: I)
where
    I: IntoIterator,
    I::Item: Borrow<(K, V)>,
    K: AsRef<str>,
    V: AsRef<str>
{
    {
        for key in iter {
            let (ref k, ref v) = key.borrow();
            append(k.as_ref(), v.as_ref());
        }
    }
}

Full example

我希望extend方法处理(&str, Option<&str>)元组上的迭代器。我尝试了不同的变体,例如:

fn extend<I, K, V>(iter: I)
where
    I: IntoIterator,
    I::Item: Borrow<(K, Option<V>)>,
    K: AsRef<str>,
    V: AsRef<str>

但是我不知道它是如何工作的。

如何向编译器解释我想要什么?

1 个答案:

答案 0 :(得分:0)

您不需要在元组中引用:

Playground

fn extend<I, K, V>(iter: I)
where
    I: IntoIterator,
    I::Item: Borrow<(K, V)>,
    K: AsRef<str>,
    V: AsRef<str>,
{
    for key in iter {
        let (k, v) = key.borrow();
        append(k.as_ref(), v.as_ref());
    }
}

fn extend2<I, K, V>(iter: I)
where
    I: IntoIterator<Item = (K, Option<V>)>,
    K: AsRef<str>,
    V: AsRef<str>,
{
    for (k, v) in iter {
        append3(k, v);
    }
}