Zig 入门:用可选整数表示找不到有效时长
接收只读整数切片,查找第一条非负时长,以可选值区分合法零与没有结果,理解切片长度和可选捕获。
本节目标
接收只读整数切片,查找第一条非负时长,以可选值区分合法零与没有结果,理解切片长度和可选捕获。
环境与运行方法
使用 Zig 0.16 工具链,保存为 lesson.zig,执行 zig build-exe lesson.zig -femit-bin=lesson,再运行 ./lesson。示例用 std.debug.print 输出到标准错误流,不能只检查标准输出。
核心思路
切片同时携带地址与长度,函数无需另传数组元素数。?u32 表示整数或 null。输入使用有符号数方便表示无效负值,通过检查后再转换为无符号结果。
完整示例
const std = @import("std");
fn firstValid(values: []const i32) ?u32 {
for (values) |value| {
if (value >= 0) return @intCast(value);
}
return null;
}
pub fn main() void {
const records = [_]i32{ -5, 0, 30 };
if (firstValid(&records)) |value| {
std.debug.print("first={d}\n", .{value});
}
std.debug.print("empty={}\n", .{firstValid(&.{}) == null});
}预期输出
first=0
empty=true逐步理解
&records 可转换为只读切片。循环按顺序查找,零已经符合条件,所以不会继续返回 30。可选捕获只在有值时执行,捕获的 value 是内部整数。
@intCast 在这里安全,因为 i32 的非负值能放进 u32。转换安全依赖前置检查,不能把同样转换直接用于任意负数。本例只读输入,不分配动态内存,也没有转移缓冲区所有权。
常见问题与边界
- 合法零与 null 是不同结果。
- 返回借用切片时要考虑底层数据生命周期。
- 编译器版本变化可能影响标准库接口,本例明确使用 0.16。
动手练习
把输入改成两个负数,再改成 {30,0}。
参考答案
全负输入没有有效项,主分支不打印 first;第二组返回 30,因为函数查找第一条而不是最小值。函数名与契约应明确这种顺序含义。
文章回复
0 条公开回复