gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:34:22 25 4
gpt4 key购买 nike

如何定义一个具有多态结构和与其关联的特征的 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 版本不匹配,并导致有关期望 1 个参数并获得 2 个参数的不同编译器错误。

最佳答案

有几个方向可供选择:

  • 添加 phantom data marker for Evaluator :

    use std::marker;

    pub trait StateEvaluator<State> {
    fn eval(state: State, buf: &mut [u8]);
    }

    pub struct Interpreter<State, Evaluator> {
    state: State,
    evaluator: marker::PhantomData<Evaluator>,
    }

    impl<State: Default + Clone, Evaluator: StateEvaluator<State>> Interpreter<State, Evaluator> {
    pub fn new() -> Interpreter<State, Evaluator> {
    Interpreter {
    state: Default::default(),
    evaluator: marker::PhantomData,
    }
    }

    pub fn eval(&self, buf: &mut [u8]) {
    Evaluator::eval(self.state.clone(), buf)
    }
    }

    这样在结构中使用泛型类型。 (请注意,我已经做出了将 Clone 绑定(bind)到 State 的行政决定,以便 eval 可以传递一个 StateStateEvaluator;您也可以使用 &StateCopy 绑定(bind)。)

  • Evaluator 泛型从类型转移到 eval 函数。这可能不是您想要的,但我会提到它。

    pub trait StateEvaluator<State> {
    fn eval(state: State, buf: &mut [u8]);
    }

    pub struct Interpreter<State> {
    state: State,
    }

    impl<State: Default + Clone> Interpreter<State> {
    pub fn new() -> Interpreter<State> {
    Interpreter {
    state: Default::default(),
    }
    }

    pub fn eval<Evaluator: StateEvaluator<State>>(&self, buf: &mut [u8]) {
    Evaluator::eval(self.state.clone(), buf)
    }
    }

关于rust - 捕获仅在实现中使用的结构中的特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29978133/

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