有没有一种方法可以将方法添加到我不拥有的类型中?

tsu*_*jin 15 rust

我正在尝试Grid从piston-2dgraphics库扩展struct.没有办法在特定单元格的窗口上获取位置,所以我实现了一个特征来为我计算.然后,我想要一种方法来计算网格上特定单元格的邻居,所以我实现了另一个特征.

关于这一点的事情是丑陋的,并且感觉不必要看,因为我可能永远不会将这些特征用于除了这个特定的网格结构之外的任何东西.Rust中是否有另一种扩展类型的方法,而不必每次都实现特征?

Fra*_*gné 17

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

您可以使用所需的方法定义自己的特征,然后为外部类型实现该特征.这种模式称为扩展特征.按照惯例,扩展特征的名称以#结尾Ext,表示该特征不打算用作通用绑定或特征对象.标准库中有一些示例.

trait DoubleExt {
    fn double(&self) -> Self;
}

impl DoubleExt for i32 {
    fn double(&self) -> Self {
        *self * 2
    }
}

fn main() {
    let a = 42;
    println!("{}", 42.double());
}
Run Code Online (Sandbox Code Playgroud)

其他库也可以导出扩展特征(例如:byteorder).但是,对于任何其他特征,您需要将特征的方法放在范围内use SomethingExt;.


aoc*_*via 7

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

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