如何定义具有与之关联的多态结构和特征的struct
,但是特征不会影响struct
定义,只有实现?
此处编译器拒绝接受Interpreter
的此定义,因为Evaluator
未使用,但在实现中是必要的:
pub trait StateEvaluator<State> {
fn eval(state: State, buf: &mut [u8]);
}
pub struct Interpreter<State, Evaluator> {
state: State
}
impl<State: Default, Evaluator: StateEvaluator<State>> Interpreter<State, Evaluator> {
pub fn new() -> Interpreter<State, Evaluator> {
Interpreter {
state: Default::default()
}
}
pub fn eval(&self, buf: &mut [u8]) {
Evaluator::eval(self.state, buf)
}
}
从struct
删除impl
导致there was one(*instance*).*method*(*parameter*)
版本不匹配,以及关于期望1参数并获得2的不同编译器错误。
答案 0 :(得分:2)
类型参数Evaluator
称为phantom type,因为它未在类型定义中使用。 Rust曾经允许这样的代码编译,但change earlier this year related to variance禁止它。相反,您必须使用type参数。
为了保持其幻象性质,您可以使用&#34;标记&#34;称为PhantomData
的种类。这是一种由编译器解释的特殊类型。
让您的代码轻松实现。只需添加一个使用幻像类型参数的PhantomData
成员:
use std::marker::PhantomData;
pub struct Interpreter<State, Evaluator> {
state: State,
_marker: PhantomData<Evaluator>,
}
然后稍微调整一下构造:
Interpreter {
state: Default::default(),
_marker: PhantomData,
}
类型推断将自动填充PhantomData
的类型参数。