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

Log*_*rat 2 rust

当我遇到这个问题时,我正在做一些关于 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));
}
Run Code Online (Sandbox Code Playgroud)

我收到一条关于此处参数的错误消息for_each()

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

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

我有一个完全不同的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
}
Run Code Online (Sandbox Code Playgroud)

这个功能符合我的要求。我将其包含在此处作为我希望迄今为止无法运行的代码执行的操作的示例。

Cha*_*man 5

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

Iterator::for_each()期望它的闭包返回单位类型(),或“无”(void在C中)。

Rust 是面向表达式的:(几乎)一切都是表达式。闭包(和函数)返回其最后一个表达式的值。也就是说,与|| expr相同,因此您的闭包返回- a|| { return expr; }的返回值,而期望它返回。insert()boolfor_each()()

修复方法很简单:您只需丢弃 的insert()返回值即可。它是通过将其变成一个语句并在其后面附加分号来完成的。这还需要您使用一个块:

possible_anagrams.iter().filter(|x| is_anagram(x)).for_each(|x| { set.insert(x); });
Run Code Online (Sandbox Code Playgroud)