gpt4 book ai didi

error-handling - 如何正确使用 Option::ok_or() 方法?

转载 作者:行者123 更新时间:2023-11-29 08:02:46 24 4
gpt4 key购买 nike

我正在尝试了解如何在 Rust 中使用问号运算符进行错误处理。我有这段代码:

fn main() -> Result<(), &'static str> {
let foo: i32 = Some("1")
.ok_or(Err("error 1"))?
.parse()
.or(Err("error 2"))?;
Ok(())
}

这段代码由于某种原因无法编译:

error[E0277]: the trait bound `&str: std::convert::From<std::result::Result<_, &str>>` is not satisfied
--> src/main.rs:2:20
|
2 | let foo: i32 = Some("1")
| ____________________^
3 | | .ok_or(Err("error 1"))?
| |_______________________________^ the trait `std::convert::From<std::result::Result<_, &str>>` is not implemented for `&str`
|
= note: required by `std::convert::From::from`

The Rust book有一个问号运算符的用法示例:

use std::io;
use std::io::Read;
use std::fs::File;

fn read_username_from_file() -> Result<String, io::Error> {
let mut s = String::new();

File::open("hello.txt")?.read_to_string(&mut s)?;

Ok(s)
}

在我看来,它与我的示例在处理错误方面没有太大区别。我看不出我的代码无效的原因。如果应该为所有类型的 Result 实现 From 特性,为什么 Rust 书中的代码可以正常工作?

最佳答案

不同于or , ok_or需要 E , 不是完整的 Result<T, E> (因为如果通过 Ok 就没有任何关系)。直接传递错误字符串即可:

fn main() -> Result<(), &'static str> {
let foo: i32 = Some("1")
.ok_or("error 1")?
.parse()
.or(Err("error 2"))?;
Ok(())
}

错误消息提到 From 的原因特质是因为?隐式使用 From将表达式的错误类型转换为返回值的错误类型。如果有效,.ok_or(Err("error 1"))将返回值 Result<&'static str, Result<_, &'static str>> ( _ 几乎可以是任何东西,因为 Err 没有指定)。 ?运算符试图找到 From 的实现这将转换 Result<_, &'static str> (表达式的错误类型)到 &'static str (返回值的错误类型)。因为没有这样的 From实现存在,编译器会发出错误。

关于error-handling - 如何正确使用 Option::ok_or() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54046081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com