12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- //
- // Remember using if/else statements as expressions like this?
- //
- // var foo: u8 = if (true) 5 else 0;
- //
- // Zig also lets you use for and while loops as expressions.
- //
- // Like 'return' for functions, you can return a value from a
- // loop block with break:
- //
- // break true; // return boolean value from block
- //
- // But what value is returned from a loop if a break statement is
- // never reached? We need a default expression. Thankfully, Zig
- // loops also have 'else' clauses! As you might have guessed, the
- // 'else' clause is evaluated when: 1) a 'while' condition becomes
- // false or 2) a 'for' loop runs out of items.
- //
- // const two: u8 = while (true) break 2 else 0; // 2
- // const three: u8 = for ([1]u8{1}) |f| break 3 else 0; // 3
- //
- // If you do not provide an else clause, an empty one will be
- // provided for you, which will evaluate to the void type, which
- // is probably not what you want. So consider the else clause
- // essential when using loops as expressions.
- //
- // const four: u8 = while (true) {
- // break 4;
- // }; // <-- ERROR! Implicit 'else void' here!
- //
- // With that in mind, see if you can fix the problem with this
- // program.
- //
- const print = @import("std").debug.print;
- pub fn main() void{
- const langs: [6][]const u8 = .{
- "Erlang",
- "Algol",
- "C",
- "OCaml",
- "Zig",
- "Prolog",
- };
-
- // Let's find the first language with a three-letter name and
- // return it from the for loop.
- const current_lang: ?[]const u8 = for (langs) |lang|{
- if(lang.len == 3){ break lang; }
- }else null;
-
- if(current_lang) |cl|{
- print("Current language: {s}\n", .{cl});
- }else{
- print("Did not find a three-letter language name. :-(\n", .{});
- }
- }
|