特征`for<" r> core :: ops :: FnMut<(&' r&(K,T),)>`未实现类型`P`

时间:2015-05-17 14:40:24

标签: rust

我想要一个(Key,Type)的排序向量,它只按Key排序。

我想出了以下代码:

struct SortedVec<K, T> {
    data: Vec<(K, T)>
}

impl<K: Ord, T> SortedVec<K, T> {
    fn new() -> SortedVec<K, T> {
        SortedVec { data: Vec::new() }
    }

    fn add(&mut self, k: K, t: T) {
        self.data.push((k, t));
        self.data.sort_by(|a, b| a.0.cmp(&b.0));
    }

    fn find<P>(&self, predicate: P) -> Option<&(K, T)> where P: FnMut(&(K, T)) -> bool {
        self.data.iter().find(predicate)
    }
}

但是这不会编译时出现以下错误:

anon>:16:30: 16:45 error: the trait `for<'r> core::ops::FnMut<(&'r &(K, T),)>` is not implemented for the type `P` [E0277]
anon>:16             self.data.iter().find(predicate)
                                       ^~~~~~~~~~~~~~~
<anon>:16:30: 16:45 error: the trait `for<'r> core::ops::FnOnce<(&'r &(K, T),)>` is not implemented for the type `P` [E0277]
<anon>:16             self.data.iter().find(predicate)
                                       ^~~~~~~~~~~~~~~
error: aborting due to 2 previous errors
playpen: application terminated with error code 101

我找不到类型的错误&#39; P&#39;

我该如何解决?

2 个答案:

答案 0 :(得分:4)

让我们比较P上的界限和需要编译器的界限:

// P
        FnMut(    &(K, T)) -> bool

// required
for<'r> FnMut(&'r &(K, T)) -> bool

如果更改where子句以匹配编译器要求的签名,则它可以正常工作(see here)。

我相信额外的引用(和生命周期)是通过使用iter引入的,因此链接到迭代器的生命周期,但是不要接受我的话。

我想指出,Vec有一个binary_search_by,它必然比线性find更有效:

fn binary_search_by<F>(&self, f: F) -> Result<usize, usize>
    where F: FnMut(&T) -> Ordering

您可能希望使用它,因为您遇到了排序它的麻烦。

答案 1 :(得分:2)

好吧,编译器已经给你提示修复了!您需要更改

中的“where”子句
fn find<P>(&self, predicate: P) -> Option<&(K, T)> 
    where P: FnMut(&(K, T)) -> bool

fn find<P>(&self, predicate: P) -> Option<&(K, T)> 
   where for<'r> P: FnMut(&'r &(K, T)) -> bool