DevCN
菜单
全部文章快讯开发深度热点

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,因为函数查找第一条而不是最小值。函数名与契约应明确这种顺序含义。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。