Ziglings 笔记 08: 综合小测验 (Quiz Time!)


阶段性测验

在学习了变量、数组、字符串之后,Ziglings 抛出了第一个“Quiz”挑战。这个练习没有直接告诉我们哪里错了,而是让我们自己去发现代码中的逻辑矛盾。

挑战:拼写 “Zig”

程序定义了一个字符串 "YZhifg",并试图通过修改索引变量 x,从中提取出字符填入 lang 数组,最终打印出 “Program in Zig!”。

原始代码中最隐蔽的错误通常在于可变性的定义上。

解决方案

这是修复后的完整代码:

const std = @import("std");

pub fn main() void {
    const letters = "YZhifg";

    // 重点 1: 这里必须用 var!
    // 因为后面我们要把 x 修改为 3 和 5。
    // 如果用 const,编译器会报错。
    // 此外,数组索引必须是 usize 类型。
    var x: usize = 1;

    // 重点 2: 使用 undefined
    // 我们声明了一个长度为 3 的数组,但暂时不初始化它。
    // 这在 Zig 中很常见,前提是你确信随后会立即填充它。
    var lang: [3]u8 = undefined;

    // 步骤 1: 取出 'Z' (索引 1)
    lang[0] = letters[x];

    // 步骤 2: 修改 x 并取出 'i' (索引 3)
    x = 3;
    lang[1] = letters[x];

    // 步骤 3: 修改 x 并取出 'g' (索引 5)
    x = 5;
    lang[2] = letters[x];

    // 打印结果:{s} 可以正确处理 [3]u8 数组
    std.debug.print("Program in {s}!\n", .{lang});
}

核心知识点回顾

1. var 还是 const

这是 Zig 编程中需要时刻问自己的问题。 在这个练习中,x 充当了一个游标(cursor),它的值在程序运行过程中发生了变化(1 -> 3 -> 5),因此它必须是 var

2. usize 是索引的标准

在 Zig 中,永远使用 usize 作为数组或切片的索引。不要尝试用 u8i32 来索引数组,类型系统会阻止你这么做,以确保内存访问的安全性。

3. undefined 是把双刃剑

var lang: [3]u8 = undefined; 允许我们跳过初始化步骤,这在高性能场景下很有用。但如果我们在赋值之前读取 lang,就会得到无意义的脏数据(甚至在某些构建模式下触发崩溃)。


后续预告:顺利通过了第一次测验!接下来,我们将进入控制流的核心部分——if 表达式。Zig 的 if 语句和 C 语言很像,但它其实也是一个表达式,能返回值哦。