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

4 rust

使用这个文件:

use std::env;

fn main() {
    println!("{}", env::args().nth(3)?);
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

use std::env;

fn main() {
    println!("{}", env::args().nth(3)?);
}
Run Code Online (Sandbox Code Playgroud)

然而,这令人困惑,因为nth确实返回Option

fn nth(&mut self, n: usize) -> Option<Self::Item>
Run Code Online (Sandbox Code Playgroud)

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

Sta*_*eur 5

The return type of main must implement std::process::Termination(currently it's an unstable trait). If you look at the end of the documentation, you will see:

impl Termination for !
impl Termination for ()
impl Termination for ExitCode
impl<E: Debug> Termination for Result<!, E>
impl<E: Debug> Termination for Result<(), E>
Run Code Online (Sandbox Code Playgroud)

If you want to return an Option you must implement the trait on it. This is not practical because you can't implement a trait on foreign type, so the best solution is to convert Option<T> to Result<T, E>:

use std::env;

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

See also:


Mic*_*son 2

如果应用到的值为 ,则该运算?符将导致包含它的函数返回。None?None

这意味着你可以写

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

因为nth返回一个Option<Item>not_main返回一个Option<()>

但是,您的main不返回Option,因此?无法在其中工作。

如何解决这个问题取决于您在缺少参数的情况下想要做什么。最残酷的解决方案是相反unwrap- 这会导致你的代码出现恐慌。

fn main() {
    println!("{}", env::args().nth(3).unwrap())
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是匹配并处理丢失的情况

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

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

fn main() {
    println!("{:?}", std::env::args().nth(3));
}
Run Code Online (Sandbox Code Playgroud)