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 的函数参数是“不可变”的,这是真的吗?下一篇我们将深入探讨函数参数。