Просмотр исходного кода

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
Chris Boesch 1 год назад
Родитель
Сommit
f496d79ab9
2 измененных файлов с 27 добавлено и 12 удалено
  1. 19 4
      exercises/046_optionals2.zig
  2. 8 8
      patches/patches/046_optionals2.patch

+ 19 - 4
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 ???
     }
 }

+ 8 - 8
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;
      }