Rust 有没有一种方法可以为可能有任何数字元素的元组执行trait?
我有这样一个特点: 特色食品{ fn做点什么自我->自我; } 我想为一个元组实现这个特性,这个元组可以有任意数量的元素来实现这个特性 T的impl Foo,其中T:Foo{ fn做点什么自我->自我{ 设t0,t1=self; t0.做点什么,t1.做点什么 } } T,T,T的impl Foo,其中T:Foo{ fn做点什么自我->自我{ 设t0,t1,t2=self; t0.做点什么,t1.做点什么,t2.做点什么 } } //等等。。。Rust 有没有一种方法可以为可能有任何数字元素的元组执行trait?,rust,Rust,我有这样一个特点: 特色食品{ fn做点什么自我->自我; } 我想为一个元组实现这个特性,这个元组可以有任意数量的元素来实现这个特性 T的impl Foo,其中T:Foo{ fn做点什么自我->自我{ 设t0,t1=self; t0.做点什么,t1.做点什么 } } T,T,T的impl Foo,其中T:Foo{ fn做点什么自我->自我{ 设t0,t1,t2=self; t0.做点什么,t1.做点什么,t2.做点什么 } } //等等。。。 不可以。除非您准备好使用宏-请参阅其他答案 Rus
不可以。除非您准备好使用宏-请参阅其他答案 Rust中的元组具有固定长度。我不相信你能表达任何长度的元组的概念 换句话说,由2个元素组成的元组与由3个元素组成的元组是不同的复合类型。如果您坚持使用元组,那么您必须采用上面概述的解决方案 使用集合?例如,给现有的一个别名并在其上实现trait?注意:我不确定是否应该这样做,但这里有一种方法可以解决这个问题。我觉得有点不舒服,这可能是因为我不知道如何制作更好的宏 齐次元组T,T 您描述它的方式: T的impl Foo,其中T:Foo 在这里,整个元组必须是同质的,即MyType,MyType2.do_由于单态化,有些东西不能工作。 这会引起一个标志,因为元组用于异构数据 如果只实现一个同构元组仍然是您想要的,那么我们可以通过这种方式实现宏,并进行一些修改。单击impl右侧的src以查看其源代码
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 }
如果元组中的所有项都是相同的类型,您考虑过使用数组或Vec吗?现在似乎不可能。看看元组本身如何实现不同的特性:不,使用数组。
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 }