代码之家  ›  专栏  ›  技术社区  ›  Pierre-olivier Gendraud

如何为基本类型添加特征?

  •  -1
  • Pierre-olivier Gendraud  · 技术社区  · 5 年前

    我在试着延长时间 Grid 活塞-2d图形库中的结构。没有任何方法可以获得特定单元格在窗口上的位置,所以我实现了一个trait来计算这个位置。然后,我想要一种方法来计算网格上某个特定单元的邻居,所以我实现了另一个特性。

    关于这一点是丑陋的,感觉没有必要看到我怎么可能永远不会使用这些特点以外的任何其他特定的网格结构。Rust中是否有其他方法可以扩展类型而不必每次都实现traits?

    0 回复  |  直到 6 年前
        1
  •  23
  •   Shepmaster Tim Diekmann    6 年前

    从1.27开始,没有别的办法了。在另一个板条箱中定义的类型上定义固有方法是不可能的。

    您可以使用所需的方法定义自己的trait,然后为外部类型实现该trait。这种模式被称为 延伸性状 . 按照惯例,扩展特性的名称以 Ext ,表示此特征不打算用作泛型绑定或特征对象。 There are a few examples in the standard library.

    trait DoubleExt {
        fn double(&self) -> Self;
    }
    
    impl DoubleExt for i32 {
        fn double(&self) -> Self {
            *self * 2
        }
    }
    
    fn main() {
        let a = 42;
        println!("{}", 42.double());
    }
    

    其他库也可以导出扩展特性(例如: byteorder ). 但是,对于任何其他特性,您需要将特性的方法纳入 use SomethingExt; .

        2
  •  4
  •   aochagavia    9 年前

    不。目前,为另一个板条箱中定义的类型编写新方法的唯一方法是通过traits。但是,这似乎太麻烦了,因为您必须编写特性定义和实现的代码。

    在我看来,要走的路是使用自由函数而不是方法。这至少可以避免由特质造成的重复。