【问题标题】:How can I specify the type of a closure argument?如何指定闭包参数的类型?
【发布时间】:2016-12-30 10:35:06
【问题描述】:

我正在尝试做这样的事情,但它无法在 inspect 的闭包参数上编译:

fn main() {
    vec!(1, 2, 3, 4)
        .windows(2)
        .inspect(|&&a[]| println!("{} {}", a[0], a[1]))
        .count();
}

我尝试移动切片名称a,但找不到编译器理解的最佳点。

【问题讨论】:

  • inspect(|a| ...) 有什么问题吗?
  • 谢谢,它正在工作!太简单了,我真的太复杂了。

标签: rust closures


【解决方案1】:

直接的答案是使用冒号,就像在其他任何地方定义参数类型一样:

fn main() {
    vec!(1, 2, 3, 4)
        .windows(2)
        .inspect(|a: &&[u8]| println!("{} {}", a[0], a[1]))
        .count();
}

正如 Matthieu M. 所指出的,根本没有理由在此处指定类型,因为类型推断会处理它:

fn main() {
    vec!(1, 2, 3, 4)
        .windows(2)
        .inspect(|a| println!("{} {}", a[0], a[1]))
        .count();
}

为了完整起见,您还可以指定闭包的返回类型,尽管这样做需要为闭包主体加上大括号。同样,这很少需要:

fn main() {
    vec!(1, 2, 3, 4)
        .windows(2)
        .map(|a: &[u8]| -> bool { a[0] % 2 == 0 })
        .inspect(|a| println!("{}", a))
        .count();
}

【讨论】:

    猜你喜欢
    • 2019-11-13
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    相关资源
    最近更新 更多