2.6.1 解答
01-解答 — Comprehensive Rust
2 分钟阅读
译文 · 基于 Comprehensive Rust
原文链接: https://google.github.io/comprehensive-rust/pattern-matching/exercise.html
让我们为算术表达式写一个简单的递归求值器。
一个小算术表达式的例子是 10 + 20,求值为 30。可以把表达式表示成树:
.-------.
.------ | + | ------.
| '-------' |
v v
.--------. .--------.
| 10 | | 20 |
'--------' '--------'
更大更复杂的表达式可以是 (10 * 9) + ((3 - 4) * 5),求值为 85。我们把它表示成更大的树:
.-----.
.---------------- | + | ----------------.
| '-----' |
v v
.-----. .-----.
.---- | * | ----. .---- | * | ----.
| '-----' | | '-----' |
v v v v
.------. .-----. .-----. .-----.
| 10 | | 9 | .---- | "-"| ----. | 5 |
'------' '-----' | '-----' | '-----'
v v
.-----. .-----.
| 3 | | 4 |
'-----' '-----'
在代码中,我们用两种类型表示这棵树:
| |
这里的 Box 类型是智能指针,课程后面会详细介绍。可以用测试中看到的 Box::new 把表达式「装箱」。要求值已装箱的表达式,用解引用运算符(*)「拆箱」:eval(*boxed_expr)。
用下面命令新建一个 Cargo 库项目:
| |
把下面的代码复制粘贴到 src/lib.rs 文件中。
然后开始实现 eval。用 cargo test 确保最终库通过测试。可以借助 todo!() 让测试逐个通过。也可以用 #[ignore] 暂时跳过某个测试:
#[test]
#[ignore]
fn test_value() { .. }
| |
01-解答 — Comprehensive Rust