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

时间:2015-10-27 19:04:51

标签: rust

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

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

2 个答案:

答案 0 :(得分:12)

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

您可以使用所需的方法定义自己的特征,然后为外部类型实现该特征。此模式称为扩展特征。按照惯例,扩展特征的名称以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;将特征的方法放在范围内。

答案 1 :(得分:4)

没有。目前,为另一个包中定义的类型编写新方法的唯一方法是通过特征。但是,这似乎太麻烦了,因为你必须编写特征定义和实现。

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