for_each() 函数的参数似乎是错误的类型

Argument to for_each() function appears to be the wrong type

当我 运行 遇到这个问题时,我正在通过一些关于 Exercism 的编程练习。我不清楚为什么设置为 for_each() 的闭包类型甚至很重要。

这是整个 Rust 程序:

use std::collections::HashSet;

// reformat(word) returns a tuple mapping its argument to (lowercase, sorted_lowercase)
fn reformat(word: &str) -> (String,String) {
    let lower = word.to_lowercase();
    let mut char_vec : Vec<char> = lower.chars().collect();
    char_vec.sort_unstable();
    let sorted : String = char_vec.iter().collect();
    (lower,sorted)
}

// Items in 'possible_anagrams' will be added to the set if they contain all of the
// same characters as 'word' but arranged in a different order.
fn anagrams_for<'a>(word: &str, possible_anagrams: &'a [&str]) -> HashSet<&'a str> {
    let mut set = HashSet::<&str>::new();
    let w = reformat(word);
    let is_anagram = |x:&str|->bool{let t=reformat(x);w.1==t.1&&w.0!=t.0};
    possible_anagrams.iter().filter(|x|is_anagram(x)).for_each(|x| set.insert(x));
    set
}

fn main() {
    let a : [&str; 4] = ["FRBA", "Braf", "wut", "batt"];
    println!("{:#?}", anagrams_for("Frab", &a));
}

我在此处收到有关 for_each() 参数的错误消息:

       |
    18 |     possible_anagrams.iter().filter(|x|is_anagram(x)).for_each(|x| set.insert(x));
       |                                                                    ^^^^^^^^^^^^^ 
expected `()`, found `bool`

错误信息我一点都不清楚。我尝试了各种补救措施,但我所做的任何更改似乎都会让事情变得更糟,即出现更多错误消息。

我有一个完全不同的 anagrams_for() 功能正常工作的表现形式。因此,就编码练习而言,我已经通过此函数的以下版本解决了它:

pub fn anagrams_for<'a>(word: &str, possible_anagrams: &'a[&str]) -> HashSet<&'a str> {
    let mut set = HashSet::<&str>::new();
    let w = reformat(word);
    for x in possible_anagrams {
        let test = reformat(x);
        if w.1 == test.1 && w.0 != test.0 {
            set.insert(x);
        }
    }
    set
}

这个功能如我所愿。我将其包含在此处作为我希望到目前为止无法运行的代码执行的示例。

HashSet::insert() returns booltrue 如果该值已经在集合中)。

Iterator::for_each() 期望其关闭为 return 单位类型 (),或“无”(void 在 C 中)。

Rust 是 expression-oriented:(几乎)一切都是表达式。闭包(和函数)return 是它们最后一个表达式的值。也就是说,|| expr|| { return expr; } 相同,因此您的闭包 return 是 insert() 的 return 值 - bool,而for_each() 期望它 return ().

修复很简单:您只需丢弃 insert() 的 return 值。它是通过将其添加到语句中并附加分号来完成的。这也需要你使用一个块:

possible_anagrams.iter().filter(|x| is_anagram(x)).for_each(|x| { set.insert(x); });