【发布时间】:2016-03-26 13:12:38
【问题描述】:
我正在编写一个不区分大小写的字谜查找器,给定一个单词和一个单词列表。我有以下代码:
pub fn anagrams_for(s: &'static str, v: &[&'static str]) -> Vec<&'static str> {
let mut s_sorted: Vec<_> = s.to_lowercase().chars().collect();
s_sorted.sort();
v.iter().filter_map(move |word: &str| {
let mut word_sorted: Vec<_> = word.to_lowercase().chars().collect();
word_sorted.sort();
if word_sorted == s_sorted && s.to_lowercase() != word.to_lowercase() {
Some(word)
} else {
None
}
}).collect()
}
这样做的逻辑是对给定的小写单词进行排序,对于向量中的每个单词,都做同样的事情。如果单词在排序前不同(以消除自字谜)但在排序后是相同的,则将其添加到输出中。
不过,上面似乎在从周围范围捕获s 和s_sorted 时遇到问题,因为当我编译时出现以下错误:
错误:类型不匹配:类型
[closure@src/lib.rs:23:25: 32:6 s_sorted:_, s:_]实现了特征for<'r> core::ops::FnMut<(&'r str,)>,但特征core::ops::FnMut<(&&str,)>是必需的(预期为&-ptr,找到str)
当我查看此错误类型([E0281])的描述时,我发现了以下 TL;DR:
这种情况下的问题是
foo被定义为接受Fn而没有 参数,但我们试图传递给它的闭包需要一个参数。
这很令人困惑,因为我认为 move closures capture variables 来自周围的范围。
我错过了什么?
【问题讨论】: