parameters - 有什么方法可以使闭包采用解构数组?
问题描述
我正在做这个代码高尔夫挑战,并想出了这个问题的解决方案:
fn main() {
let f = |s:&[u8]|s.chunks(2).all(|n|n[0]==n[1]);
println!("{}", f(b"TThhiiss iiss ddoouubbllee ssppeeaakk!!"));
}
该解决方案有效,但我认为n[0]==n[1]
看起来不太优雅并尝试了类似的方法:
fn main() {
let f = |s:&[u8]|s.chunks(2).all(|[a,b]|a==b);
println!("{}", f(b"TThhiiss iiss ddoouubbllee ssppeeaakk!!"));
}
但这失败并出现错误:
error[E0005]: refutable pattern in function argument: `&[]` not covered --> src/main.rs:2:39 | 2 | let f = |s:&[u8]|s.chunks(2).all(|[a,b]|a==b); | ^^^^^ pattern `&[]` not covered
有没有办法通过改变闭包参数来完成上述工作(其他一切都应该保持原样):
fn main() {
let f = |s:&[u8]|s.chunks(2).all(|/* anything here */|a==b);
println!("{}", f(b"TThhiiss iiss ddoouubbllee ssppeeaakk!!"));
}
解决方案
不。
函数参数是模式,并且这些模式必须始终是无可辩驳的。
使用itertools
,您可以这样做:
use itertools::Itertools;
fn main() {
let f = |s:&[u8]|s.iter().tuples().all(|(a,b)|a==b);
println!("{}", f(b"TThhiiss iiss ddoouubbllee ssppeeaakk!!"));
}
这可以工作,因为tuples
它会推断它恰好需要 2 个元素。如果有奇数个元素,最后一个将被忽略。
推荐阅读
- python - 如何使用 Python 将新数据插入 JSON 文件
- java - 如何改进数十万个项目的for循环?-- 格式化这么多项目的实际问题
- javascript - TypeError:无法读取属性....未定义
- mysql - MySQL - 存在触发器时导出数据然后再次导入
- python - 机械化导入“ModuleNoFoundError”
- python - 使用 pycharm 在 vagrant 实例中调试 django 应用程序,其中 python3 作为 docker 容器
- android - 是否可以从 apk 文件中提取 google-services.json?
- spring - 如何使用 maven 打包没有主类的自定义 spring-boot 启动器
- django - django-rest-auth with Google:如何正确发布访问令牌
- regex - 使用正则表达式(封闭模式)搜索和替换 VS Code