gpt4 book ai didi

rust - 特性 `for<' r> core::ops::FnMut<( &'r &(K, T),)>` 没有为类型 `P` 实现

转载 作者:行者123 更新时间:2023-11-29 07:57:48 25 4
gpt4 key购买 nike

我想要一个(键,类型)的排序向量,它仅按键排序。

我想出了下面的代码:

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

我找不到类型“P”的任何问题。

我该如何解决?

最佳答案

让我们比较 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

您可能希望改用它,因为您麻烦地对其进行排序。

关于rust - 特性 `for<' r> core::ops::FnMut<( &'r &(K, T),)>` 没有为类型 `P` 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30288001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com