如何在枚举中匹配自我?

奇人

我有一个枚举:

enum Expr {
    Lit(u32),
    Var(Id),
    Ass(Id, u32),
    Add(u32, u32),
    Sub(u32, u32),
    Mul(u32, u32),
}

我正在尝试实现一种方法:

impl Expr {
    fn eval(&self, env: &mut Env) -> Result<u32, String> {
        use Expr::*;

        match *self {
            Lit(l) => Ok(l),
            Var(id) => env.lookup(&id).ok_or_else(|| format!("undefined var {:?}", id)),
            Ass(id, v) => {
                env.assign(id, v);
                Ok(v)
            }
            Add(f, s) => Ok(f + s),
            Sub(f, s) => Ok(f - s),
            Mul(f, s) => Ok(f * s),
        }
    }
}

但出现以下错误:

error[E0507]: cannot move out of borrowed content
  --> src/main.rs:25:15
   |
25 |         match *self {
   |               ^^^^^ cannot move out of borrowed content
26 |             Lit(l) => Ok(l),
27 |             Var(id) => env.lookup(&id).ok_or_else(|| format!("undefined var {:?}", id)),
   |                 -- hint: to prevent move, use `ref id` or `ref mut id`
28 |             Ass(id, v) => {
   |                 -- ...and here (use `ref id` or `ref mut id`)

没有星星,我也会得到一个错误:

error[E0308]: mismatched types
  --> src/main.rs:25:17
   |
25 |                 Lit(l) => Ok(l),
   |                 ^^^^^^ expected &Expr, found enum `Expr`
   |
   = note: expected type `&Expr`
   = note:    found type `Expr`

我想我理解第一个错误:我试图做的事情超出了我所允许的(不可变的)借阅范围self,但是我不确定第二个错误。我不知道如何正确执行此操作。

安托约

对于第一个问题,您需要使用ref@Adrian所说的关键字:

impl Expr {
    fn eval(&self, env: &mut Env) -> Result<u32, String> {
        use Expr::*;

        match *self {
            Lit(l) => Ok(l),
            Var(ref id) => env.lookup(id).ok_or_else(|| format!("undefined var {:?}", id)),
            Ass(ref id, v) => {
                env.assign(id.clone(), v);
                Ok(v)
            }
            Add(f, s) => Ok(f + s),
            Sub(f, s) => Ok(f - s),
            Mul(f, s) => Ok(f * s),
        }
    }
}

使用ref可以防止模式匹配获得的所有权id正如您提到的,您不允许从中id提取值,Expr因为您只有一个不变的引用。vf并且s不会出现此问题,因为它们是u32实现的Copy与其复制价值,不如复制价值,保留原始价值。

我不知道什么EnvId类型的,或者的定义lookupassign,因此,或许一些clone()调用是没有必要的。

对于第二个问题,这是因为self类型为&Expr,因此您需要&在模式中包括

impl Expr {
    fn eval(&self, env: &mut Env) -> Result<u32, String> {
        use Expr::*;

        match self {
            &Lit(l) => Ok(l),
            &Var(ref id) => env.lookup(id).ok_or_else(|| format!("undefined var {:?}", id)),
            &Ass(ref id, v) => {
                env.assign(id.clone(), v);
                Ok(v)
            }
            &Add(f, s) => Ok(f + s),
            &Sub(f, s) => Ok(f - s),
            &Mul(f, s) => Ok(f * s),
        }
    }
}

两种匹配形式都是等效的,但是*self更加惯用且需要更少的输入:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在定义中引用自我?

来自分类Dev

我如何在mongodb中设置自我加入

来自分类Dev

Scala.js:如何在Webworker中访问自我

来自分类Dev

如何在MySQL中自我加入聚合函数的结果?

来自分类Dev

如何在ArangoDB中使用自我Join访问集合中多个文档中的数据

来自分类Dev

在Rust中,如何使自我成为特征?

来自分类Dev

如何在Xcode 7.3中的控制台中访问“自我”

来自分类Dev

如何在Sequelize中建立自我参照的多对多关联?

来自分类Dev

PostgreSQL自我参照表-如何在脚本中存储父ID?

来自分类Dev

如何在travis中运行composer.phar自我更新

来自分类Dev

如何在Google Analytics(分析)中避免将子域作为自我引荐?

来自分类Dev

如何在yii中与同一张表建立自我关系

来自分类Dev

如何在travis中运行composer.phar自我更新

来自分类Dev

我如何在另一个枚举中引用一个枚举

来自分类Dev

如何在golang中枚举?

来自分类Dev

如何自我加入?

来自分类Dev

如何自我加入?

来自分类Dev

我如何在另一个表 ruby on rails 中自我引用用户

来自分类Dev

如何在类范围内访问“自我”?

来自分类Dev

如何在XSD中进行自我参考

来自分类Dev

如何在XDocument上使用LINQ进行自我联接?

来自分类Dev

如何在多个自我联接上指定排序顺序

来自分类Dev

如何在python中保存“自我”变量?

来自分类Dev

如何在KDB查询中进行自我联接?

来自分类Dev

Messenger 如何在后台自我刷新?

来自分类Dev

如何在自我构建的joomla组件中构建所见即所得的编辑器

来自分类Dev

如何使用自我联接重塑熊猫中的重复行?

来自分类Dev

如何让Class函数在python中自我重复?

来自分类Dev

如何在C中枚举枚举中的所有内容?

Related 相关文章

热门标签

归档