我有这样一个特质:
trait Foo {
fn do_something(self) -> Self;
}
Run Code Online (Sandbox Code Playgroud)
我想为一个元组实现此特征,该元组可能具有任意数量的实现此特征的元素。
impl<T> Foo for (T, T) where T: Foo {
fn do_something(self) -> Self {
let (t0, t1) = self;
(t0.do_something(), t1.do_something())
}
}
impl<T> Foo for (T, T, T) where T: Foo {
fn do_something(self) -> Self {
let (t0, t1, t2) = self;
(t0.do_something(), t1.do_something(), t2.do_something())
}
}
// and so on...
Run Code Online (Sandbox Code Playgroud)
注意:我不确定你是否应该这样做,但无论如何,这里有一个方法。(对我来说感觉很奇怪,这可能是因为我不知道如何制作更好的宏。)
(T, T)你描述的方式:
impl<T> Foo for (T, T) where T: Foo
这里,整个元组必须是同质的(即由于单态化而
不起作用(MyType, MyType2).do_something()) 。这引发了一个问题,因为元组适用于异构数据。
如果您仍然想要只实现一个同构元组的特征,我们可以像标准库那样实现一个宏来实现不同长度元组的特征,并进行一些修改。(单击src右侧impl即可查看其来源。)
macro_rules! replace_expr {
($_t:tt $sub:ty) => {$sub};
}
macro_rules! tuple_impls {
( $( $name:ident )+ ) => {
impl<T: Foo> Foo for ($(replace_expr!(($name) T),)+)
{
fn do_something(self) -> Self {
let ($($name,)+) = self;
($($name.do_something(),)+)
}
}
};
}
tuple_impls! { A }
tuple_impls! { A B }
tuple_impls! { A B C }
tuple_impls! { A B C D }
tuple_impls! { A B C D E }
tuple_impls! { A B C D E F }
tuple_impls! { A B C D E F G }
tuple_impls! { A B C D E F G H }
tuple_impls! { A B C D E F G H I }
tuple_impls! { A B C D E F G H I J }
tuple_impls! { A B C D E F G H I J K }
tuple_impls! { A B C D E F G H I J K L }
Run Code Online (Sandbox Code Playgroud)
(T1, T2)如果您可以正常(MyType, MyType2).do_something()工作(两者都实现了该Foo特征),您可以尝试这个更简单的宏:
macro_rules! tuple_impls {
( $( $name:ident )+ ) => {
impl<$($name: Foo),+> Foo for ($($name,)+)
{
fn do_something(self) -> Self {
let ($($name,)+) = self;
($($name.do_something(),)+)
}
}
};
}
tuple_impls! { A }
tuple_impls! { A B }
tuple_impls! { A B C }
tuple_impls! { A B C D }
tuple_impls! { A B C D E }
tuple_impls! { A B C D E F }
tuple_impls! { A B C D E F G }
tuple_impls! { A B C D E F G H }
tuple_impls! { A B C D E F G H I }
tuple_impls! { A B C D E F G H I J }
tuple_impls! { A B C D E F G H I J K }
tuple_impls! { A B C D E F G H I J K L }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7720 次 |
| 最近记录: |