aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/exercises/45_optionals.zig
diff options
context:
space:
mode:
authorDave Gauer <dave@ratfactor.com>2021-02-14 10:49:09 -0500
committerDave Gauer <dave@ratfactor.com>2021-02-14 10:49:09 -0500
commit545573fc84c2b8e3f281de7eb9bc52281536d5b3 (patch)
treebcac00066425034a1d22183690ee507c32328cbd /exercises/45_optionals.zig
parent16dbeea7f5e8c7327709052ed6e0a869f759f871 (diff)
Added ex 45 optionals
(And secretly added the patches/ dir. Don't tell anybody!)
Diffstat (limited to 'exercises/45_optionals.zig')
-rw-r--r--exercises/45_optionals.zig52
1 files changed, 52 insertions, 0 deletions
diff --git a/exercises/45_optionals.zig b/exercises/45_optionals.zig
new file mode 100644
index 0000000..815ba75
--- /dev/null
+++ b/exercises/45_optionals.zig
@@ -0,0 +1,52 @@
+//
+// Sometimes you know that a variable might hold a value or
+// it might not. Zig has a neat way of expressing this idea
+// called Optionals. An optional type just has a '?' like this:
+//
+// var foo: ?u32 = 10;
+//
+// Now foo can store a u32 integer OR null (a value storing
+// the cosmic horror of a value NOT EXISTING!)
+//
+// foo = null;
+//
+// if (foo == null) beginScreaming();
+//
+// Before we can use the optional value as the non-null type
+// (a u32 integer in this case), we need to guarantee that it
+// isn't null. One way to do this is to THREATEN IT with the
+// "orelse" statement.
+//
+// var bar = foo orelse 2;
+//
+// Here, bar will either equal the u32 integer value stored in
+// foo, or it will equal 2 if foo was null.
+//
+const std = @import("std");
+
+pub fn main() void {
+ const result = deepThought();
+
+ // Please threaten the result so that answer is either the
+ // integer value from deepThought() OR the number 42:
+ var answer: u8 = result;
+
+ std.debug.print("The Ultimate Answer: {}.\n",.{answer});
+}
+
+fn deepThought() ?u8 {
+ // It seems Deep Thought's output has declined in quality.
+ // But we'll leave this as-is. Sorry Deep Thought.
+ return null;
+}
+//
+// Blast from the past:
+//
+// Optionals are a lot like error union types which can either
+// hold a value or an error. Likewise, the orelse statement is
+// like the catch statement used to "unwrap" a value or supply
+// a default value:
+//
+// var maybe_bad: Error!u32 = Error.Evil;
+// var number: u32 = maybe_bad catch 0;
+//