diff options
author | Dave Gauer <dave@ratfactor.com> | 2021-02-06 09:29:49 -0500 |
---|---|---|
committer | Dave Gauer <dave@ratfactor.com> | 2021-02-06 09:29:49 -0500 |
commit | 2cded107cd75a4024d9d0f76055ef48432301fad (patch) | |
tree | 3c0b1240e15a60e80d1d3e0d574f06cdfd12b6d6 /35_enums.zig | |
parent | 738a9f6cda62f3570e44dc93f8e200afc2cc1b51 (diff) | |
download | ziglings-2cded107cd75a4024d9d0f76055ef48432301fad.tar.gz ziglings-2cded107cd75a4024d9d0f76055ef48432301fad.tar.bz2 ziglings-2cded107cd75a4024d9d0f76055ef48432301fad.tar.xz ziglings-2cded107cd75a4024d9d0f76055ef48432301fad.zip |
Add ex 35,36 enums; updated README
I'm changing the order of some more topics. Trying to explain the value
of pointers when we're mostly dealing with stack-sized values like
integers feels convoluted. So I'm starting with enums (which also has a
nice segue from an earlier "switch" exercise). Then structs. Then unions
(just in keeping with the order of these items on ziglearn.org) and THEN
pointers and multi-pointers and slices.
Diffstat (limited to '35_enums.zig')
-rw-r--r-- | 35_enums.zig | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/35_enums.zig b/35_enums.zig new file mode 100644 index 0000000..cf455a4 --- /dev/null +++ b/35_enums.zig @@ -0,0 +1,49 @@ +// +// Remember that little mathematical virtual machine we made using the +// "unreachable" statement? Well, there were two problems with the +// way we were using op codes: +// +// 1. Having to remember op codes by number is no good. +// 2. We had to use "unreachable" because Zig had no way of knowing +// how many valid op codes there were. +// +// An "enum" is a Zig construct that lets you give names to numeric +// values and store them in a set. They look a lot like error sets: +// +// const Fruit = enum{ apple, pear, orange }; +// +// const my_fruit = Fruit.apple; +// +// Let's use an enum in place of the numbers we were using in the +// previous version! +// +const std = @import("std"); + +// Please complete the enum! +const Ops = enum{ ??? }; + +pub fn main() void { + const operations = [_]Ops{ + Ops.inc, + Ops.inc, + Ops.inc, + Ops.pow, + Ops.dec, + Ops.dec + }; + + var current_value: u32 = 0; + + for (operations) |op| { + switch (op) { + Ops.inc => { current_value += 1; }, + Ops.dec => { current_value -= 1; }, + Ops.pow => { current_value *= current_value; }, + // No "else" needed! Why is that? + } + + std.debug.print("{} ", .{current_value}); + } + + std.debug.print("\n", .{}); +} |