【发布时间】:2020-04-29 15:04:28
【问题描述】:
我有这个闭包color,但类型系统无法推断其pixel 参数的类型。
pub fn solve_part2(input: &[u32]) -> String {
let color = |pixel| {
pixel
.skip_while(|l| **l == 2)
.next()
.map(|c| char::from_digit(*c, 10).unwrap())
.unwrap()
};
let pixel = |n| input.iter().skip(n).step_by(25 * 6);
(0..(25 * 6)).map(|px| color(pixel(px))).collect()
}
加上注解的类型,就变成了
let color = |pixel: std::iter::StepBy<std::iter::Skip<std::slice::Iter<u32>>>| {
pixel
.skip_while(|l| **l == 2)
.next()
.map(|c| char::from_digit(*c, 10).unwrap())
.unwrap()
};
有没有什么技巧可以帮助类型系统在不注解的情况下推断pixel的类型?
【问题讨论】:
-
如果
color闭包只使用一次,您可以将它内联移动到map调用中。 -
@Dai 这就是我最初拥有它的方式,但为了清楚起见将其移出。它确实内联工作正常。
-
另一种选择是使用类型别名。您还可以通过将这些类型导入作用域来使其更简洁 - 请记住,Rust 不是 C++,因此您无需避免导入命名空间(与 C++ 中的
using namespace std;不同):stackoverflow.com/questions/29013617/… - 所以没有任何问题在你的代码中有StepBy<Skip<Itr<u32>>>。 -
关于为什么在闭包中需要类型注释的部分相关讨论:google.com/amp/s/amp.reddit.com/r/rust/comments/5g6oa0/…
-
可以是known issue。
标签: rust type-inference