当我用问号传播错误时,我发现不同类型的错误工作正常,代码如下:

struct Car {
    brand: String
}

impl From<String> for Car {
    fn from(brand: String) -> Self {
        Car { brand }
    }
}

fn bar() -> Result<Car, String> {
    Err(String::from("xxxx"))
}

fn f() -> Result<Car,Car> {
   let c= bar()?;
   Ok(Car::from(String::from("xxx")))
}

但当直接返回不同类型的错误时,如以下代码所示:

struct Car {
    brand: String
}

impl From<String> for Car {
    fn from(brand: String) -> Self {
        Car { brand }
    }
}

fn bar() -> Result<Car,String> {
    Err(String::from("xxxx"))
}

fn f() -> Result<Car,Car> {
   
   Err(String::from("xxx"))
}

编译器抱怨返回类型不匹配.直接返回和问号有什么不同?是否会应用带有问号的隐式类型转换?谢谢!

推荐答案

很简单,问号操作符? expands to return Err(From::from(err)).

但是,您的最后一个示例没有显式地try 将String转换为Car,因此出现了错误.在Rust中,转换不能隐式发生

Rust相关问答推荐

无需通过ASIO输入音频,并使用cpal进行反馈示例

将JSON密钥转换为Polars DataFrame

如何装箱生命周期相关联的两个对象?

如何从铁 rust 中呼唤_mm_256_mul_ph?

在Rust中,在实现特征`Display`时,如何获取调用方指定的格式?

告诉Rust编译器返回值不包含构造函数中提供的引用

rust 蚀生命周期 不匹配-不一定超过此处定义的生命周期

关于使用平面图功能的borrow 判断器的问题

如何从宏调用闭包?

Rust 中的复合 `HashSet` 操作或如何在 Rust 中获得 `HashSet` 的显式差异/并集

Boxing 如何将数据从堆栈移动到堆?

我们可以在 Rust 切片中使用步骤吗?

Rust中的标记特征是什么?

从 Rust 中的 if/else 中的引用创建 MappedRwLockWriteGuard

Rust:`sort_by` 多个条件,冗长的模式匹配

在 FFI 的上下文中,未初始化是什么意思?

编写 TOML 文件以反序列化为 struct 中的枚举

如何制作具有关联类型的特征的类型擦除版本?

为什么我返回的 impl Trait 的生命周期限制在其输入的生命周期内?

为什么 Bevy 的 Trait 边界不满足 Rapier 物理插件?