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)
我误解了文档还是这是一个错误?
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:
如果应用到的值为 ,则该运算?符将导致包含它的函数返回。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)