Ziglings 笔记 34: 阶段性测验 4 - 修复打印逻辑

找回丢失的输出

在 Ziglings 的第 34 个练习(Quiz 4)中,我们面对的是一个无法工作的程序。 它的目标很简单:获取一个数字(42)并打印出来。但是,用来打印的代码看起来非常奇怪,甚至有点“像其他语言”的写法。

解决方案

我不去动那个奇怪的 getNumber 函数(题目要求),只修复 main 函数:

const std = @import("std");

const NumError = error{IllegalNumber};

pub fn main() !void {
    var stdout = std.fs.File.stdout().writer(&.{});

    // 这行是正确的:使用 try 解包 result 或者抛出错误
    const my_num: u32 = try getNumber();

    try stdout.interface.print("my_num={}\n", .{my_num});
}

// 题目要求不修改此函数
fn getNumber() NumError!u32 {
    if (false) return NumError.IllegalNumber;
    return 42;
}

核心知识点回顾

try 的解包能力

再次复习一下 try 的作用: const val = try func(); 这一行代码做了两件事:

  1. 控制流:如果 func() 报错,当前函数直接返回该错误。
  2. 数据流:如果 func() 成功,将结果赋值给 val。 这使得 my_num 变成了纯净的 u32,而不是带错误的联合类型。

后续预告:我们已经通过了所有的基础测验!接下来,我们将进入 Zig 数据类型的深水区——枚举 (Enums)。它比 C 语言的枚举要强大得多。