捕获仅在实现中使用的结构中的特征

时间:2015-04-30 21:32:03

标签: rust traits

如何定义具有与之关联的多态结构和特征的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的不同编译器错误。

1 个答案:

答案 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的类型参数。