使用此文件:
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>
我误解了文档还是这是一个错误?
答案 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
,因此您可以打印调试版本-它将输出None
或Some("arg3")
。
fn main() {
println!("{:?}", std::env::args().nth(3));
}