为什么可以?运算符将 &str 转换为 Box<dyn Error>?

Mic*_*ung 3 rust

请考虑以下两个函数:

\n
use std::error::Error;\n\nfn foo() -> Result<i32, Box<dyn Error>> {\n    let x: Result<Result<i32, Box<dyn Error>>, &str> = Err("error");\n    x?\n}\n\nfn bar() -> Result<i32, Box<dyn Error>> {\n    Err("error")\n}\n
Run Code Online (Sandbox Code Playgroud)\n

foo()会编译,但是bar()不会\xe2\x80\x99t。

\n

我想我明白为什么bar()\xe2\x80\x99t 不起作用:我们期望一个对象实现Errora 中的特征Box,但我们传递的 a&str既不实现Error也不在 a 中Box

\n

我想知道为什么foo()可以编译。在这种情况下,Won\xe2\x80\x99t?操作员也尝试将 转换&str为 a吗Box<dyn Error>?为什么它能成功?

\n

use*_*968 11

这是有效的,因为有一个

impl From<&'_ str> for Box<dyn Error>
Run Code Online (Sandbox Code Playgroud)

在标准库中。这就是从 a 转换为 a的? 用途。此实现又使用in std,它具有“隐藏”类型,在实现 时使用作为其描述。&strBox<dyn Error>impl From<String> for Box<dyn Error>StringError