rust 如何接受一个通用集合,该集合同时适用于`for a in &coll`和`for a in coll`

kq0g1dla  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(139)

这是出于爱好/学习的目的。我试图推出我自己的中心间隔树实现-我想为我的IntervalTree结构体做一个From<C>,其中C是一些通用的“可迭代”集合。
为了做到这一点,我有两个主要步骤:
1.执行for a in &coll以计算“中心”
1.执行for a in coll以使用集合并构建树
似乎我需要为C提供两个类型边界:

C: IntoIterator<Item = A>,
&C: IntoIterator<Item = &A>

在遵循编译器的建议之后,我得到了到处都是的生存期界限,并且得到了一个我不知道如何解决的错误:
x一个一个一个一个x一个一个二个x
我可以通过接受Vec<A>来使我的生活更轻松,但由于这是“仅仅为了好玩”,我想我应该尝试使用类型泛型。

lp0sw83n

lp0sw83n1#

因为你使用了一个通用的生存期,所以调用者需要选择它。但是调用者选择的生存期不一定与coll的生存期匹配(事实上,它永远不可能匹配),这就是错误。
你想要的是Higher-Ranked Trait Bounds,这意味着Iterator在 * 每个 * 生命周期都实现:

fn iter_twice<C, A>(coll: C)
where
    for<'a> &'a C: IntoIterator<Item = &'a A>,
    C: IntoIterator<Item = A>,
{
    // ...
}

相关问题