当前位置: 首页 > 知识库问答 >
问题:

是否有可能自动实现任何由所有实现特征的类型组成的元组的特征?

申高峰
2023-03-14

假设我有一个

trait Happy {}

我可以为任何我可能想要的结构实现Happy,例如:

struct Dog;
struct Cat;
struct Alligator;

impl Happy for Dog {}
impl Happy for Cat {}
impl Happy for Alligator {}

现在,我想自动impl我的快乐特征,无论元组是由所有实现快乐特征的类型组成的。直觉上,所有快乐的元组也是快乐的。

有可能做这样的事吗?例如,我可以简单地将Happy的实现扩展到两种Happy类型的任意元组:

impl <T, Q> Happy for (T, Q) where T: Happy, Q: Happy {}

因此,这可以完美地编译:

fn f(_: impl Happy) {
}

fn main() {
    f((Dog{}, Alligator{}));
}

但是我怎么能把它推广到任何长度的元组呢?就我的理解而言,我们在Rust中没有变异的泛型。有变通办法吗?

共有1个答案

丌官嘉勋
2023-03-14

我们在Rust中没有可变的泛型。

对的

有解决办法吗?

您使用宏:

trait Happy {}

macro_rules! tuple_impls {
    ( $head:ident, $( $tail:ident, )* ) => {
        impl<$head, $( $tail ),*> Happy for ($head, $( $tail ),*)
        where
            $head: Happy,
            $( $tail: Happy ),*
        {
            // interesting delegation here, as needed
        }

        tuple_impls!($( $tail, )*);
    };

    () => {};
}

tuple_impls!(A, B, C, D, E, F, G, H, I, J,);

这现在编译:

fn example<T: Happy>() {}

fn call<A: Happy, B: Happy>() {
    example::<(A, B)>();
} 

这通常不被视为一个大问题,因为长元组基本上是不可读的,如果真的需要,您可以嵌套元组。

另见:

  • 自动为新类型实现封闭类型的特征(具有一个字段的元组结构)
 类似资料:
  • 在Java中,所有对象都继承自。在Go中,所有类型/结构都实现空接口。Rust语言中是否有类似的构造? 如果答案是否定的,是什么让它变得不必要?这是因为Rust中的所有实体(模块除外)都可以按类型参数化吗?这是否消除了所有Rust实体/结构/枚举共享的公共“超类型”或公共特性的需要?

  • 我有一个设计问题,当使用类似的东西时: 我认为应该有一些更好的方法来实现这种参数化的特性。 我在std中没有找到好的示例(例如,在具有类似的关联类型的traits中没有实现)?

  • 我在Scala中读到过,通常建议使用特征而不是抽象类来扩展基类。 下面是一个好的设计模式和布局吗?特征就是这样取代抽象的吗? 客户端类(具有def功能1) Trait1类(重写函数1) Trait2类(重写函数1) SpecificClient1使用trait1扩展客户端 SpecificClient2使用trait2扩展客户端

  • 本文向大家介绍基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式,包括了基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式的使用技巧和注意事项,需要的朋友参考一下 前言 在面向对象的编程范式中,封装都是必不可少的一个概念,而在诸如 Java,C++等传统的面向对象的语言中, 私有成员是实现封装的一个重要途径。但在 JavaScript 中,确没有在语法特性上

  • 我正在尝试将DHT11库用于我的STM32F303VC 我得到错误: 我的错误图像: 我的代码在辅助模块中是: 我的main.rs代码是:

  • 但是现在,我希望这些接口实现也可用于扩展,例如。 我如何设置我的课程来实现这一点?(或者,反对这样做的固有缺陷或代码气味是什么?)