functional-programming - 在 map 内部使用 if 时如何处理 "if may be missing an else clause"?

标签 functional-programming rust

我正在开展一项代码挑战,它将从单词列表中检测给定单词的不区分大小写的字谜。

我的第一个剪辑是使用这样的东西:

pub fn anagrams_for(s: &'static str, v: &[&'static str]) -> Vec<&'static str> {
    let mut outputs: Vec<&str> = vec![];

    // Find the case-insensitive, sorted word to check
    let mut s_sorted: Vec<_> = s.to_string().to_lowercase().chars().collect();
    s_sorted.sort();

    for word in v {
        // Case-desensitize and sort each word in the slice
        let mut word_sorted: Vec<_> = word.to_string().to_lowercase().chars().collect();
        word_sorted.sort();

        // if the case-insensitive words are the same post sort and not presort (to avoid self-anagrams), add it to the vector
        if word_sorted == s_sorted && s.to_string().to_lowercase() != word.to_string().to_lowercase() {
            outputs.push(word)
        }
    }
    outputs
}

这按预期工作,但不太惯用。我现在正在尝试第二次迭代,它使用 Rust 的更多功能特性:

pub fn anagrams_for(s: &'static str, v: &[&'static str]) -> Vec<&'static str> {
    let mut s_sorted: Vec<_> = s.to_string().to_lowercase().chars().collect();
    s_sorted.sort();

    v.iter().map(&|word: &str| {
        let mut word_sorted: Vec<_> = word.to_string().to_lowercase().chars().collect();
        word_sorted.sort();

        if word_sorted == s_sorted && s.to_string().to_lowercase() != word.to_string().to_lowercase() {
            word
        } 
    }).collect()
}

我目前遇到了一些错误(其中大部分我可以解决),但我有兴趣解决的错误是

if may be missing an else clause:
 expected `()`,
    found `&str`
(expected (),
    found &-ptr) [E0308]

这是因为在非字谜的情况下,map 尝试将某些内容插入向量中(看似 ())。

我该如何处理这个问题? map 可能不是最好的习惯用法,因为它需要对列表中的每个元素执行一些操作,而不是子集(可能是 filter?).

最佳答案

正如您所注意到的,问题在于,在非字谜情况下,您的闭包(|| { ... } block )不会返回值。

您可以使用 filter_map 来解决此问题而不是map 。该函数采用一个返回 Option<U> 的闭包。而不是U ,所以你的闭包的最后一个表达式看起来像这样:

if /* ... */ {
    Some(word)
} else {
    None
} 

与主要问题无关,关于您的代码的一些注释:

  • 您可以删除 .to_string()之前来电.to_lowercase()来电。后一种方法属于类型 str ,所以效果很好。调用to_string()添加不必要的分配。
  • &在闭包( &|...| )前面很可能被删除......
  • ... : &str 也可以闭包参数列表中的类型注释

关于functional-programming - 在 map 内部使用 if 时如何处理 "if may be missing an else clause"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36230664/

相关文章:

haskell - Applicative (Functor) 类型类的简单概括;构造函数的模式匹配

javascript - 避免复杂的 if 语句

rust - 为什么我不能将 &&mut 转换为 && ?

rust - 如何在 Rust 中拆分字符串?

multithreading - 将带有引用的迭代器移到线程中

functional-programming - 关于 OCaml 模式匹配语法

java - 在 java 8 中映射有序列表

struct - 有没有一种方法可以基于特征实现创建结构?

rust - 在近协议(protocol)合约的函数中返回多个值

C# 纯函数字典