gpt4 book ai didi

generics - 通用超特征/需要一揽子 impl

转载 作者:行者123 更新时间:2023-12-03 11:36:42 25 4
gpt4 key购买 nike

目前,我有这样的特点:

trait Trait
where
Self: Sized,
{
fn try_form_u8(num: u8) -> Option<Self>;
fn try_from_str<T: AsRef<str>>(s: &T) -> Option<Self>;
// ...
}
理想情况下,我想像这样定义它,以便没有 try_from_* TryFrom 之外的方法执行:
trait Trait: for<T: AsRef<str>> TryFrom<u8> + TryFrom<T>
where
Self: Sized
{
// ...
}
我找不到实现这一点的方法,最后遇到了这个帖子: Can a trait have a supertrait that is parameterized by a generic?
我想知道如何从这里继续。我应该使用非常规的 try_from_str方法还是有更好的方法来表达这里需要什么?
请注意,在我的原始代码中,我有 Path而不是 str ,这可以消除一些特殊的解决方案,但是如果有任何好的解决方案,我仍然想知道它们!

最佳答案

如果一个类型实现了 TryFrom<&str> , 从 String 创建它是微不足道的或 Rc<str>或任何其他 AsRef<str> .所以让我们从那个开始:

trait Trait: TryFrom<u8> + for<'a> TryFrom<&'a str> {}
只需调用 .as_ref() 即可轻松将其与其他类型一起使用,但如果你仍然想要通用版本,你可以提供一个默认实现:
trait Trait: TryFrom<u8> + for<'a> TryFrom<&'a str> {
fn try_from_str<S: AsRef<str>>(arg: &S) -> Result<Self, <Self as TryFrom<&str>>::Error> {
arg.as_ref().try_into()
}
}
这样, Trait 的实现者不用写什么特别的,但用户还是有方便的 try_from_str功能。 Path版本
trait Trait: TryFrom<u8> + for<'a> TryFrom<&'a Path> {
fn try_from_path<P: AsRef<Path>>(arg: &P) -> Result<Self, <Self as TryFrom<&Path>>::Error> {
arg.as_ref().try_into()
}
}
str版本
对于 str具体来说,您可能想要使用标准库特征 FromStr而不是 TryFrom ,更专门用于此用例,启用 str::parse并且不需要更高级别的特征界限:
trait Trait: TryFrom<u8> + FromStr {
fn try_from_str<S: AsRef<str>>(arg: &S) -> Result<Self, <Self as FromStr>::Err> {
arg.as_ref().parse()
}
}

关于generics - 通用超特征/需要一揽子 impl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64616371/

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