rust - 为实现特定类型的 trait 的泛型类型实现 trait
问题描述
这个问题的标题与许多相关问题非常相似,但我还没有找到一个讨论这个特定问题的问题。
我有一个Color
非常简单定义的类型,如下所示:
pub struct Color {
red: u8,
green: u8,
blue: u8,
}
现在,为了与其他库交互并转换为定点数,能够将其与包含任意数字类型的任何元组相互转换是很有用的。
为此,我使用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),
}
}
}
特征绑定为我提供了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),
)
}
}
但我似乎找不到真正写这个的方法。我检查了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),
)
}
}
推荐阅读
- excel - 如何设置范围
- python - 给定n,取n的数字的tsum。如果该值超过一位,则继续减少一位数
- java - 将文字分配给 Float 时出现类型不匹配错误
- xml - 我如何指定要在 powershell selectnodes 中读取的 xml 属性
- kotlin - kotlin 中与平台无关的 Web 框架
- python - 在烧瓶上执行 py 脚本的问题
- ios - 核心数据对象保存没有错误,但数据检索方法不会立即显示保存的结果
- sql - DB2 SQLPL - 无法退出无限循环
- python - 错误:在 Python 3.8 (Windows) 上安装 Kivy 时命令出错,退出状态为 255
- python - 有没有办法从列表中获取一个元素并以变量的名称使用它?