Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 有没有一种方法可以为可能有任何数字元素的元组执行trait?_Rust - Fatal编程技术网

Rust 有没有一种方法可以为可能有任何数字元素的元组执行trait?

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

我有这样一个特点:

特色食品{ 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中的元组具有固定长度。我不相信你能表达任何长度的元组的概念

换句话说,由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 }