我正在开展一项代码挑战,它将从单词列表中检测给定单词的不区分大小写的字谜。
我的第一个剪辑是使用这样的东西:
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/