为什么我不能使用?我的主函数中的运算符返回一个选项?

时间:2018-12-05 04:23:33

标签: rust

使用此文件:

use std::env;

fn main() {
    println!("{}", env::args().nth(3)?);
}

我收到此错误:

error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`)
 --> src/main.rs:4:20
  |
4 |     println!("{}", env::args().nth(3)?);
  |                    ^^^^^^^^^^^^^^^^^^^ cannot use the `?` operator in a function that returns `()`
  |
  = help: the trait `std::ops::Try` is not implemented for `()`
  = note: required by `std::ops::Try::from_error`

但这令人困惑,因为nth does return Option

fn nth(&mut self, n: usize) -> Option<Self::Item>

我误解了文档还是这是一个错误?

2 个答案:

答案 0 :(得分:2)

返回类型main必须实现std::process::Termination(当前是不稳定的特征)。如果您查看文档的末尾,将会看到:

impl Termination for !
impl Termination for ()
impl Termination for ExitCode
impl<E: Debug> Termination for Result<!, E>
impl<E: Debug> Termination for Result<(), E>

如果要返回Option,则必须在其上实现特征。 because you can't implement a trait on foreign type不切实际,因此最好的解决方案是将Option<T>转换为Result<T, E>

use std::env;

fn main() -> Result<(), Box<std::error::Error>> {
    println!("{}", env::args().nth(3).ok_or("Missing argument")?);
    Ok(())
}

另请参阅:

答案 1 :(得分:1)

如果将?应用于的值是None?运算符将使包含它的函数返回None

这意味着您可以写

fn not_main() -> Option<()> {
    println!("{}", std::env::args().nth(3)?);
    Ok(())
}

因为nth返回Option<Item>,而not_main返回Option<()>

但是,您的main不会返回Option,因此?不能在其中运行。

如何解决此问题将取决于在缺少参数的情况下要执行的操作。最残酷的解决方案是改为unwrap-这会导致您的代码出现紧急情况。

fn main() {
    println!("{}", env::args().nth(3).unwrap())
}

一种替代方法是匹配并处理丢失的案件

fn main() {
    match std::env::args().nth(3) {
        Some(ref v) => println!("{}", v),
        None => println!("Missing argument"),
    }
}

由于Option支持Debug,因此您可以打印调试版本-它将输出NoneSome("arg3")

fn main() {
    println!("{:?}", std::env::args().nth(3));
}