Ziglings 笔记 18: 函数初体验

搭建积木

在 Ziglings 的第 18 个练习中,我终于开始定义自己的函数了。在此之前,我一直都在 main 函数里打转,现在是时候把逻辑封装出去了。

挑战:终极答案

代码试图调用一个名为 deepThought 的函数来获取“宇宙终极问题的答案”(即 42),但这个函数尚未定义。

我们需要补充这个函数的定义。注释里还特意问了一个问题:为什么这里不需要 pub 关键字?

解决方案

这是我的实现代码:

const std = @import("std");

pub fn main() void {
    const answer: u8 = deepThought();
    std.debug.print("Answer to the Ultimate Question: {}\n", .{answer});
}

// 定义 deepThought 函数
// 1. 不需要参数 ()
// 2. 返回类型是 u8
// 3. 这里的 42 刚好在 u8 (0-255) 的范围内
fn deepThought() u8 {
    return 42; 
}

核心知识点总结

1. 函数基本语法

Zig 的函数定义格式为:fn 函数名(参数...) 返回类型 { ... }。 这与 C 语言把返回类型放在最前面不同,Zig 的这种写法(类似 TypeScript 或 Go)更符合阅读习惯:先知道名字,再看参数,最后看返回什么。

2. 可见性控制 (pub)

在这个练习中,main 函数前必须加 pub,因为它是程序的入口,需要在文件外部被构建系统访问。 而 deepThought 函数不需要 pub,因为它只被同一个文件内的 main 调用。 规则:Zig 的函数默认是私有的。这是一种很好的默认安全设置,防止不必要的内部实现泄露给外部模块。


后续预告:定义了无参数函数很简单,但如果我要传递参数进去呢?而且听说 Zig 的函数参数是“不可变”的,这是真的吗?下一篇我们将深入探讨函数参数。