【发布时间】:2021-09-27 12:50:05
【问题描述】:
我正在尝试为解析树之类的东西实现递归枚举。目前我的出发点是这样的:
#[derive(Debug)]
enum Value<T: Add + Copy> {
Sum(Rc<Value<T>>, Rc<Value<T>>),
Scalar(T)
}
显然我现在只关心加法,以后会添加其他操作。我想实现Add trait 来启用以下功能:
let x = Value<f32>::Scalar(0.3);
let y = Value<f32>::Scalar(0.3);
let z = x + y;
z 现在应该是 Value<f32>::Sum 和 x 和 y 不应移动。我的问题是如何实现 Add 特征。或者更确切地说是针对哪些类型。我的第一种方法如下所示:
impl<T: Add + Copy> Add for crate::Value<T> {
type Output = Self;
fn add(self, other: Value<T>) -> Self {
...
}
}
此解决方案可编译,但数据已移动。如果我尝试将 add 方法的参数更改为引用,则会失败,因为签名与预期的不匹配。有道理,所以我尝试为&Value<T> 实现特征。这似乎可行,但我不能再写x + y,因为它们不是参考。我也很纠结返回类型,因为它不能是&Value<T>,而必须是Value<T>。
我采取了另一种方法来完全使用Rc<Value<T>>,但我不允许为Rc<...> 实现Add。我知道有一个 AsRef 特征,但我对 Rust 很陌生,现在知道它如何适合我的用例。
任何提示如何将这些部分组合在一起并让它们工作将非常感激。
【问题讨论】:
标签: rust