是否可以在类型别名上实现固有方法?

时间:2016-02-23 04:30:44

标签: rust

考虑以下实施:

pub struct BST {
    root: Link,
}

type Link = Option<Box<Node>>;

struct Node {
    left: Link,
    elem: i32,
    right: Link,
}

impl Link { /* misc */ }

impl BST { /* misc */ }

我一直收到错误:

  

无法为定义类型的crate之外的类型定义固有impl;改为定义和实现特征或新类型

我能够找到其他人had this same issue back in February,但当时似乎没有解决方案。

在Rust中实现我的Link typedef是否有任何修复或其他方法?

1 个答案:

答案 0 :(得分:19)

  

有没有修复

不是真的。 类型别名type Foo = Bar创建新类型。它所做的就是创建一个引用现有类型的不同名称。

在Rust中,不允许为来自另一个箱子的类型实现固有方法。

  

我实施的另一种方式

正常的解决方案是创建一种全新的类型。事实上,它goes by the name newtype

struct Link(Option<Box<Node>>);

impl Link {
    // methods all up in here
}

这没有运行时间的缺点 - 两个版本将占用完全相同的空间量。此外,您不会意外地暴露任何您并不意味着的方法。例如,您真的希望代码的客户能够拨打Option::take吗?

另一个解决方案是创建自己的 trait ,然后为您的类型实现它。从呼叫者的角度来看,它看起来基本相同:

type Link = Option<Box<Node>>;

trait LinkMethods {
    fn cool_method(&self);
}

impl LinkMethods for Link {
    fn cool_method(&self) {
        // ...
    }
}

这里的烦恼是特质LinkMethods必须在调用这些方法的范围内。