gpt4 book ai didi

enums - 如何在枚举中匹配 self ?

转载 作者:行者123 更新时间:2023-11-29 08:33:22 25 4
gpt4 key购买 nike

我有一个枚举:

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 的所有权。正如您提到的,您不能从 Expr 中取出 id 的值,因为您只有一个不可变的引用。 vfs 没有这个问题,因为它们是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 更加地道并且需要更少的输入:)

关于enums - 如何在枚举中匹配 self ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41751262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com