请考虑以下两个函数:
\nuse 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}\nRun Code Online (Sandbox Code Playgroud)\nfoo()会编译,但是bar()不会\xe2\x80\x99t。
我想我明白为什么bar()\xe2\x80\x99t 不起作用:我们期望一个对象实现Errora 中的特征Box,但我们传递的 a&str既不实现Error也不在 a 中Box。
我想知道为什么foo()可以编译。在这种情况下,Won\xe2\x80\x99t?操作员也尝试将 转换&str为 a吗Box<dyn Error>?为什么它能成功?
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