我是 Rust 新手,在处理特征和泛型方面遇到困难。我首先定义一个特征来为我做一些工作,然后定义一个将其用作类型参数的通用结构。现在我意识到,在原始特征中,我实际上想使用我定义的结构,所以我处于一种循环中。我不知道如何摆脱它,并且想知道我想要的东西是否可以通过泛型实现,或者也许我需要使用拳击或其他一些方法?下面的最小示例。
这就是我最初的开始:
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
trait. WorkResult
现在需要一个类型参数,但它在特征中是未知的。我尝试了很多不同的方法,但无法让编译器喜欢它。
Attempt:
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
即使用作边界,特征也需要类型参数,因此您需要编写where T: Worker<U>
.
不幸的是,在特征定义的情况下,这将变得递归。例如,如果您这样做:
trait Worker<T>
where T: Worker<U>,
{...}
然后,您需要向工作人员添加第二个通用参数,这将需要第三个,依此类推。另一种可能性,where T: Worker<T>
从技术上讲是可以编译的,但它使得该特征不可能(或者至少超出了我的能力)成功实现。
一种可能的解决方案是将类型参数移至work
函数,就像这样:
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
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)