下面是rustlings try_from
练习的一部分的工作解决方案。
impl TryFrom<(i16, i16, i16)> for Color {
type Error = IntoColorError;
fn try_from(tuple: (i16, i16, i16)) -> Result<Self, Self::Error> {
let (red, green, blue) = tuple;
match (u8::try_from(red), u8::try_from(green), u8::try_from(blue)) {
(Ok(red), Ok(green), Ok(blue)) => Ok(Color { red, green, blue }),
_ => Err(Self::Error::IntConversion),
}
}
}
这是一个很好的解决方案,但有很多代码重复。有一个解决方案似乎是明智的,其中元组转换可以在单个表达式中完成。例如:
impl TryFrom<(i16, i16, i16)> for Color {
type Error = IntoColorError;
fn try_from(tuple: (i16, i16, i16)) -> Result<Self, Self::Error> {
match <(u8, u8, u8)>::try_from(tuple) {
Ok((red, green, blue)) => Ok(Color { red, green, blue }),
_ => Err(Self::Error::IntConversion),
}
}
}
这不起作用,但编译器可以自动推断组合元组的TryFrom
特征似乎是合理的。有没有什么方法可以让这种行为?
2条答案
按热度按时间gblwokeq1#
我认为在目前的稳定,你有什么是完全好的。在Nightly上,或者一旦数组上的
try_map()
方法稳定下来,你就可以访问一个更好的实现:这使用了在Rust 1.71版本中稳定的
impl From<(T, T, T)> for [T; 3]
,以及上面提到的仍然不稳定的try_map()
方法。(Playground)
如果你想为
Color
添加更多的From
和TryFrom
实现,你可以将它们构建在彼此之上,并将每个impl中的代码减少到最少,例如:7eumitmz2#
你可以将元组转换成数组,这样你就可以使用
map
:但是从一开始就为数组实现它可能会更干净。