问号操作符生锈错误"不满足特征限制"

时间:2017-09-03 05:33:44

标签: rust

use std::io;
use std::fs::File;
use std::io::prelude::*;

fn main() {
    let mut csv = File::open("Item.csv")?;
}

这是我的代码的一部分,我有错误:

   Compiling eracsv v0.1.0 (file:///C:/Users/jwm/Project/eracsv)
error[E0277]: the trait bound `(): std::ops::Try` is not satisfied
 --> src\main.rs:
  |
  |     let mut csv = File::open("Item.csv")?;
  |                   -----------------------
  |                   |
  |                   the `?` operator can only be used in a function that returns `Result` (or another type that implements `std::ops::Try`)
  |                   in this macro invocation
  |
  = help: the trait `std::ops::Try` is not implemented for `()`
  = note: required by `std::ops::Try::from_error`

我已经处理了rustc 1.19稳定和每晚1.22并且都出现了相同的错误。

但是,这与rust doc的代码完全相同,不是吗?明确提到File :: open()函数返回结果。

我很好奇为什么?运算符使unwrap()没有编译错误。

1 个答案:

答案 0 :(得分:5)

错误消息实际告诉您的是您在返回?的函数内使用()运算符(这是main函数)。 ?运算符向上传播错误,但只有在它实际使用的函数实际上具有可表示该错误的兼容返回类型时才能执行此操作。

或者换句话说,您只能在自己返回Result的函数中使用它(具有兼容的错误类型)。您的main未返回Result,因此您无法在其中使用?运算符。

您可能也对[{3}}感兴趣,这样可以在?中使用main(允许您声明main返回Result })。