error-handling - 创建使用 try 运算符的闭包时如何修复错误 "type annotations needed"?

标签 error-handling rust closures type-inference

use std::fs::File;

fn main() {
    let tmp = "tmp.zip";

    let save_to_tmp_file = || {
        let mut tmp_zip = File::create(tmp)?;
        Ok(())
    };

    save_to_tmp_file();
}

( playground )

构建错误:

error[E0282]: type annotations needed
 --> src/main.rs:7:27
  |
6 |     let save_to_tmp_file = || {
  |         ---------------- consider giving `save_to_tmp_file` a type
7 |         let mut tmp_zip = File::create(tmp)?;
  |                           ^^^^^^^^^^^^^^^^^^ cannot infer type for `_`

最佳答案

你必须指定返回类型:

use std::fs::File;
use std::io;

fn main() {
    let tmp = "tmp.zip";

    let save_to_tmp_file = || -> Result<(), io::Error> {
        let mut tmp_zip = File::create(tmp)?;
        Ok(())
    };

    save_to_tmp_file();
}

关闭有问题。您不能命名闭包的类型;您可以尝试将其缩减为 FnOnce/FnMut,但您仍然必须为其提供返回类型。

为了克服您的情况,您可以将 Result 指定为 return type for your main function .

use std::io;
use std::fs::File;

fn main() -> Result<(), io::Error> {
    let tmp = "tmp.zip";
    let mut tmp_zip = File::create(tmp)?;
    Ok(())
}

关于error-handling - 创建使用 try 运算符的闭包时如何修复错误 "type annotations needed"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51476828/

相关文章:

vb.net - 如何检测仅在安装程序后才会出现的错误?

oracle - 如何将 Oracle 查询结果返回给 Rust main 函数?

c++ - 为什么这个 C++11 lambda 的行为不像我预期的那样?

javascript - 为什么我的函数结束(使用外部库)

java - 虽然循环不检查两个条件?

vb.net - 无法验证VB上的登录

multidimensional-array - 如何获取具有动态形状的 Rust ndarray 切片?

generics - 错误 : Expected Type Parameter, 发现关闭

javascript - 在 javascript 中全局导入

javascript - 变量在错误的范围内(也许需要闭包?)