rust出现循环Trait

weak_ptr
  • 666

我在写简单的类lisp解释器,在编写enviroment模块时需要一个结构储存所有内建函数的结构,以便查找调用。
我的代码是这样的:

#[derive(Debug)]
pub enum Value {
    Label(String),
    Identifier(String),
    Integer(i64),
    Float(f64),
    String(String),
    List(List),
}

#[derive(Debug)]
pub struct List(pub Vec<Value>);

// ***注意,Function居然需要指定T: Function<T>,死递归定义***
pub trait Function<T: Function<T>> {
    fn do_func(env: &mut Enviroment<T>, args: &List) -> Value;
}

pub struct Enviroment<T: Function<T>> {
    binds: BTreeMap<String, ValueBinds<T>>,
}

pub enum ValueBinds<T: Function<T>> {
    value_bind(Value),
    fn_bind(T)
}

问题就在于,Enviroment需要保存绑定信息,绑定信息包含了函数绑定,函数绑定要求T必须实现了trait Function,于是绑定信息需要指定T: Function,可是这样的话绑定信息也有了泛型参数,于是又需要Enviroment指定T: Function,结果,Function中使用了Enviroment类型,于是也要指定泛型参数给Enviroment,变成了Function<T: Function>。最后Function也需要泛型参数,变成了Function<T: Function<T>>
编译不通过。

回复
阅读 2.5k
1 个回答

仔细想了下发现我搞错了什么,我想我不是想要一个泛型类,而是一个储存多态对象的map。
对应到C++,就是
class Derived: Op{}这样子。
所以,对应到rust就是Trait object。
Trait object在官方rust book中只提到了&trait这种写法,不过官方提出的指针类型中也有明确说Box也是一种语言层面的指针,所以我想,Box<Trait>是否也允许呢。

等今天回去考虑尝试后再继续补全。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏