aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Boesch <[email protected]>2024-06-24 19:13:25 +0000
committerChris Boesch <[email protected]>2024-06-24 19:13:25 +0000
commitf496d79ab9db052d6aa0cadcd68d44112a5f0724 (patch)
treeb45fcfaef061f356a8ed23140a0cf6af6233788f
parentda46008761975d676cde682af7545b02edfa8049 (diff)
parentf656e950d57dcb3bca5a75ea63b40e5062a4037c (diff)
downloadziglings-f496d79ab9db052d6aa0cadcd68d44112a5f0724.tar.xz
ziglings-f496d79ab9db052d6aa0cadcd68d44112a5f0724.zip
Merge pull request '046: Show usage of `.?` and hint towards new solution.' (#116) from alexmchughnz/ziglings:fix046 into main
Reviewed-on: https://codeberg.org/ziglings/exercises/pulls/116
-rw-r--r--exercises/046_optionals2.zig23
-rw-r--r--patches/patches/046_optionals2.patch16
2 files changed, 27 insertions, 12 deletions
diff --git a/exercises/046_optionals2.zig b/exercises/046_optionals2.zig
index e745d29..a5436d9 100644
--- a/exercises/046_optionals2.zig
+++ b/exercises/046_optionals2.zig
@@ -5,7 +5,7 @@
// linked to the first elephant. This is because we had NO CONCEPT
// of a tail that didn't point to another elephant!
//
-// We also introduce the handy ".?" shortcut:
+// We also introduce the handy `.?` shortcut:
//
// const foo = bar.?;
//
@@ -13,7 +13,8 @@
//
// const foo = bar orelse unreachable;
//
-// See if you can find where we use this shortcut below.
+// Check out where we use this shortcut below to change control flow
+// based on if an optional value exists.
//
// Now let's make those elephant tails optional!
//
@@ -31,14 +32,25 @@ pub fn main() void {
var elephantC = Elephant{ .letter = 'C' };
// Link the elephants so that each tail "points" to the next.
- elephantA.tail = &elephantB;
- elephantB.tail = &elephantC;
+ linkElephants(&elephantA, &elephantB);
+ linkElephants(&elephantB, &elephantC);
+
+ // `linkElephants` will stop the program if you try and link an
+ // elephant that doesn't exist! Uncomment and see what happens.
+ // const missingElephant: ?*Elephant = null;
+ // linkElephants(&elephantC, missingElephant);
visitElephants(&elephantA);
std.debug.print("\n", .{});
}
+// If e1 and e2 are valid pointers to elephants,
+// this function links the elephants so that e1's tail "points" to e2.
+fn linkElephants(e1: ?*Elephant, e2: ?*Elephant) void {
+ e1.?.*.tail = e2.?;
+}
+
// This function visits all elephants once, starting with the
// first elephant and following the tails to the next elephant.
fn visitElephants(first_elephant: *Elephant) void {
@@ -51,6 +63,9 @@ fn visitElephants(first_elephant: *Elephant) void {
// We should stop once we encounter a tail that
// does NOT point to another element. What can
// we put here to make that happen?
+
+ // HINT: We want something similar to what `.?` does,
+ // but instead of ending the program, we want to exit the loop...
e = e.tail ???
}
}
diff --git a/patches/patches/046_optionals2.patch b/patches/patches/046_optionals2.patch
index 164c0d6..9229f05 100644
--- a/patches/patches/046_optionals2.patch
+++ b/patches/patches/046_optionals2.patch
@@ -1,18 +1,18 @@
---- exercises/046_optionals2.zig 2024-05-10 23:11:25.796632478 +0200
-+++ answers/046_optionals2.zig 2024-05-10 23:10:16.115335668 +0200
-@@ -21,7 +21,7 @@
+--- exercises/046_optionals2.zig 2024-06-23 19:43:16
++++ answers/046_optionals2.zig 2024-06-23 19:42:46
+@@ -22,7 +22,7 @@
const Elephant = struct {
letter: u8,
- tail: *Elephant = null, // Hmm... tail needs something...
-+ tail: ?*Elephant = null, // <---- make this optional!
++ tail: ?*Elephant = null, // Hmm... tail needs something...
visited: bool = false,
};
-@@ -51,6 +51,6 @@
- // We should stop once we encounter a tail that
- // does NOT point to another element. What can
- // we put here to make that happen?
+@@ -66,6 +66,6 @@
+
+ // HINT: We want something similar to what `.?` does,
+ // but instead of ending the program, we want to exit the loop...
- e = e.tail ???
+ e = e.tail orelse break;
}