该函数应该接受一个可以转换为字符串的命令,并且我正在使用任何方法来处理错误.

pub fn converter<T: TryInto<String>>(input: T) -> Result<String>
where
    T::Error: Into<anyhow::Error>,
{
    // error here
    // the trait bound `<T as TryInto<std::string::String>>::Error: StdError` is not satisfied
    // required because of the requirements on the impl of `From<<T as TryInto<std::string::String>>::Error>` for `anyhow::Error`
    // required because of the requirements on the impl of `FromResidual<Result<Infallible, <T as TryInto<std::string::String>>::Error>>` for `Result<std::string::String, anyhow::Error>
    let out_str = input.try_into()?;
    Ok(out_str)
}

我已经将T::Error作为T::Error: Into<anyhow::Error>添加了一个类型限制,希望编译器可以进行错误处理,但显示T::Error不能转换为anyhow::Error.

类型限制引用自:https://github.com/dtolnay/anyhow/issues/172,但我仍然不知道如何将TryInto泛型与一起使用.

推荐答案

TL;DR:将T::Error: Into<anyhow::Error>替换为anyhow::Error: From<T::Error>.


这个很微妙.

您可能已经预料到?的go 糖化类似(忽略像Try特征这样的额外功能):

let out_str = match input.try_into() {
    Ok(v) => v,
    Err(e) => return Err(Into::into(e)),
};

但事实并非如此.相反,它更像是:

let out_str = match input.try_into() {
    Ok(v) => v,
    Err(e) => return Err(From::from(e)),
};

产生完全相同的错误.这是因为Result uses From to convert the error, not Into.

现在,拥有From个IML意味着拥有Into个IML-因为the blanket implementation impl<T, U: From<T>> Into<U> for T-但事实并非如此,而且,对于当前的Rust-trait系统来说,情况并非如此.

如果Result在desugaring中使用Into,那么就可以了,因为编译器可以证明where子句中的T::Error: Into<anyhow::Error>个保持,但如果它使用From,编译器无法证明anyhow::Error: From<T::Error>个保持,因此会产生错误.

过go 曾有人试图改变go 糖化(#60796),但不幸的是,它导致了太多的推理 destruct ,因此现在可能不可能.请参见:

Rust相关问答推荐

如何在原始字符串中转义";#和#";

使用 struct 外部的属性来改变 struct 的原始方式

如何在Bevy/Rapier3D中获得碰撞机的计算质量?

如何格式化传入Rust中mysql crate的Pool::new的字符串

定义只有一些字段可以缺省的 struct

变量需要parse()中的显式类型

AXUM一路由多个不包括URL的参数类型

是否提供Bundle 在可执行文件中的warp中的静态文件?

如何使用reqwest进行异步请求?

为什么rustc会自动降级其版本?

在 Rust 中忽略 None 值的正确样式

Rust与_有何区别?

是否可以通过可变引用推进可变切片?

简单 TCP 服务器的连接由对等重置错误,mio 负载较小

borrow 匹配手臂内部的可变

在运行时在 Rust 中加载字体

当 `T` 没有实现 `Debug` 时替代 `unwrap()`

使用泛型作为关联类型,没有幻像数据

您如何使用枚举反序列化字符串,其中任何其他值反序列化为新类型变体同时保留字符串?

HashMap entry() 方法使borrow 的时间比预期的长