rust - 为实现特定类型的 trait 的泛型类型实现 trait

标签 rust syntax type-conversion traits bounds

这个问题的标题与许多相关问题非常相似,但我还没有找到一个讨论这个特定问题的问题。
我有一个 Color非常简单定义的类型,如下所示:

pub struct Color {
    red: u8,
    green: u8,
    blue: u8,
}
现在,为了与其他库交互并转换为定点数,能够将其与包含任意数字类型的任何元组相互转换是很有用的。
为此,我使用 the Az crate .它定义了特征 Cast<T>并为很多类型实现它,允许我实现 From<(T, T, T)>像这样:
use az::Cast;
impl<T: Cast<u8>> From<(T, T, T)> for Color {
    fn from(components: (T, T, T)) -> Color {
        Color {
            red: Cast::cast(components.0),
            green: Cast::cast(components.1),
            blue: Cast::cast(components.2),
        }
    }
}
trait bound 为我提供了 Cast::<u8>::cast(T)功能,所以一切都按预期工作。
但是,我似乎找不到实现相反的方法,From<Color> .我实际上想要的是:
impl<T> From<Color> for (T, T, T)
where
    impl Cast<T> for u8 // This doesn't actually work
{
    fn from(color: Color) -> (T, T, T) {
        (
            Cast::cast(color.red),
            Cast::cast(color.green),
            Cast::cast(color.blue),
        )
    }
}
但我似乎找不到真正写这个的方法。我查了docs on bounds ,但似乎无法找到允许表达这一点的语法。
我该如何实现?

最佳答案

你很近。边界采用与通用边界相同的语法:

impl<T> From<Color> for (T, T, T)
where
    // u8 must implement Cast<T>
    u8: Cast<T>,
{
    fn from(color: Color) -> (T, T, T) {
        (
            Cast::cast(color.red),
            Cast::cast(color.green),
            Cast::cast(color.blue),
        )
    }
}

关于rust - 为实现特定类型的 trait 的泛型类型实现 trait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65658232/

相关文章:

linux - OSX 上的应用程序不能生成超过 2048 个线程

c - 避免 C 中的样板语法 sizeof(x)/sizeof(x[0])

php - ":"在 PHP 中是什么意思?

c# - 可以将接口(interface)添加到现有的 .NET 类型吗?

objective-c - 无法将类型 'Swift._SwiftDeferredNSDictionary<Swift.String, Swift.Double>' (0x11b1b84f8) 的值转换为 'NSMutableDictionary'

multithreading - 生成线程时无法共享Arc变量

rust - 在长时间运行的Rust线程中引用self

generics - 如何将通用特征设置为函数参数的类型?

python - Jython 和 Python 的区别

c++ - 在不更改基类的情况下将一个派生类转换为另一个派生类