为实现特定类型特征的泛型类型实现特征
Implement a trait for generic types that implement a trait for a specific type
这个问题的标题与许多相关问题非常相似,但我还没有找到讨论这个具体问题的标题。
我有一个 Color
类型,它的定义非常简单,如下所示:
pub struct Color {
red: u8,
green: u8,
blue: u8,
}
现在,为了与其他库连接并转换为 fixed-point 数字,能够将其与包含任意数字类型的任何元组相互转换是很有用的。
为此,我使用 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),
)
}
}
这个问题的标题与许多相关问题非常相似,但我还没有找到讨论这个具体问题的标题。
我有一个 Color
类型,它的定义非常简单,如下所示:
pub struct Color {
red: u8,
green: u8,
blue: u8,
}
现在,为了与其他库连接并转换为 fixed-point 数字,能够将其与包含任意数字类型的任何元组相互转换是很有用的。
为此,我使用 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),
)
}
}