[英]Can I define a trait with a type parameter of itself in Rust?
我是 Rust 的新手,在使用特征和 generics 时遇到问题。 我首先定义了一个 trait 为我做一些工作,然后定义了一个将它用作类型参数的通用结构。 现在我意识到在原始特征中,我实际上想使用我定义的结构,所以我处于一种循环中。 我不知道如何摆脱它,想知道我想要的是否可以通过 generics 实现,或者我可能需要使用拳击或其他方法? 下面的最小示例。
这是我最初开始的:
trait Worker {
fn work() -> WorkResult;
}
struct WorkResult {
result: u64;
}
接下来我意识到我想在结果上保留一个工作人员,这样我就可以懒惰地生成值并使用各种工作人员实现。
trait Worker {
fn work() -> WorkResult;
}
struct WorkResult<T> where T: Worker {
result: u64;
worker: T;
}
这就是Worker
特质开始变得奇怪的地方。 WorkResult
现在需要一个类型参数,但它在 trait 中是未知的。 我尝试了一堆不同的方法,但无法让编译器喜欢它。
试图:
trait Worker<T> where T: Worker {
fn work() -> WorkResult<T>;
}
struct WorkResult<T> where T: Worker {
result: u64;
worker: T;
}
那根本行不通。 编译器甚至无法识别参数:
error[E0107]: wrong number of type arguments: expected 1, found 0
我不能在这里插入任何具体类型(我认为我不应该这样做)。 有什么办法可以在这里完成我想要的吗?
这里的问题是Worker
trait 需要一个类型参数,即使用作边界也是如此,因此您需要编写where T: Worker<U>
。
不幸的是,在特征定义的情况下,这将是递归的。 例如,如果您这样做:
trait Worker<T>
where T: Worker<U>,
{...}
然后,您需要向 worker 添加第二个通用参数,这需要第三个参数,以此类推。 另一种可能性, where T: Worker<T>
技术上可以编译,但它使特征不可能(或至少超出我的能力)成功实现。
一种可能的解决方案是将类型参数移动到work
function,如下所示:
trait Worker {
fn work<T: Worker>() -> WorkResult<T>;
}
struct WorkResult<T: Worker> {
result: u64,
worker: T,
}
(注意struct WorkResult<T: Worker>
只是struct WorkResult<T> where T: Worker
的简写)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.