Ziglings 笔记 79: 突破命名限制 (@"")
名字的越狱
在 Ziglings 的第 79 个练习中,我们要挑战编程语言中最神圣的规则之一:命名规则。
通常,如果你试图定义一个以数字开头的变量(如 55_cows)或者包含空格的变量(如 isn't true),编译器会直接报错。
但在 Zig 中,只要你给它加上“特殊保护”,一切皆有可能。
挑战:走私违禁标识符
我们需要定义两个“非法”的变量名:
55_cows:以数字开头。isn't true:包含撇号和空格。
解决方案
使用 @"" 语法将这些怪异的名字包裹起来:
const print = @import("std").debug.print;
pub fn main() void {
// 正常情况下:
// const 55_cows = 55; // 编译错误!
// 使用标识符引用:
// 这里的 @"..." 告诉编译器:
// "别管里面的内容多离谱,把它当作一个名字就好。"
const @"55_cows": i32 = 55;
const @"isn't true": bool = false;
print("Sweet freedom: {}, {}.\n", .{
@"55_cows",
@"isn't true",
});
}
核心知识点总结
1. 为什么需要这个功能?
不仅仅是为了好玩。这个特性主要为了解决 互操作性 (Interop) 问题。
假设你在调用一个 C 语言库,那个库里有一个结构体字段叫 type。
在 Zig 中,type 是一个关键字,你不能写 my_c_struct.type。
这时,你就必须写 my_c_struct.@"type"。
2. JSON 解析的神器
当你使用 std.json 将 JSON 字符串解析为 Zig 结构体时,JSON 的键名经常包含空格或连字符。
// JSON: { "user-id": 123 }
const Payload = struct {
@"user-id": u32, // 完美映射
};
3. 这里的 @ 是什么?
你可能注意到了,Zig 中很多“魔法”都以 @ 开头:
@import: 内置函数@intCast: 类型转换@typeInfo: 编译期反射@"name": 标识符引用
这保持了语法的一致性:@ 总是意味着“编译器介入”或“元编程能力”。
后续预告:我们已经看完了 Ziglings 基础部分(从 001 到 079)。你已经掌握了这门语言的核心语法!接下来的旅程,建议开始探索 匿名结构体 (Anonymous Structs) 或者直接通过构建项目来熟悉 Zig Build System。下一篇,我们将做一个小结。