考虑以下实施:
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是否有任何修复或其他方法?
答案 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
必须在调用这些方法的范围内。