rust出现循环Trait

发布于 2022-09-02 16:00:01 字数 1141 浏览 18 评论 0

我在写简单的类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>>
编译不通过。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦幻的味道 2022-09-09 16:00:01

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文