rust出现循环Trait
我在写简单的类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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
仔细想了下发现我搞错了什么,我想我不是想要一个泛型类,而是一个储存多态对象的map。
对应到C++,就是
class Derived: Op{}
这样子。所以,对应到rust就是Trait object。
Trait object在官方rust book中只提到了&trait这种写法,不过官方提出的指针类型中也有明确说Box也是一种语言层面的指针,所以我想,
Box<Trait>
是否也允许呢。等今天回去考虑尝试后再继续补全。