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 作为数组或切片的索引。不要尝试用 u8 或 i32 来索引数组,类型系统会阻止你这么做,以确保内存访问的安全性。
3. undefined 是把双刃剑
var lang: [3]u8 = undefined; 允许我们跳过初始化步骤,这在高性能场景下很有用。但如果我们在赋值之前读取 lang,就会得到无意义的脏数据(甚至在某些构建模式下触发崩溃)。
后续预告:顺利通过了第一次测验!接下来,我们将进入控制流的核心部分——if 表达式。Zig 的 if 语句和 C 语言很像,但它其实也是一个表达式,能返回值哦。