gpt4 book ai didi

rust - 是否可以在类型别名上实现方法?

转载 作者:行者123 更新时间:2023-11-29 07:42:35 26 4
gpt4 key购买 nike

考虑以下实现:

pub struct BST {
root: Link,
}

type Link = Option<Box<Node>>;

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

impl Link { /* misc */ }

impl BST { /* misc */ }

我不断收到错误:

cannot define inherent impl for a type outside of the crate where the type is defined; define and implement a trait or new type instead

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

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

最佳答案

Is there any fix

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

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

another way for me to implement

正常的解决方案是创建一个全新的类型。事实上,它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 必须在范围内才能调用这些方法。您也不能为您不拥有的类型实现您不拥有的特征。

另见:

关于rust - 是否可以在类型别名上实现方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35568871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com