文章
Zig中的“.前缀”的用法
目录
下面是对 Zig 中 “.” 前缀(dot literal)及其在复合字面量和字段设计ator里用法的完整整合说明。#
一、.{ … }:通用复合字面量前缀#
- 作用:告诉编译器“这里是一个复合类型(数组/向量/结构体/元组/切片/error-union/枚举分支等)的字面量”,而不是一个
{ … }代码块。 - 基本形式:
.{ Item0, Item1, … } ```
- 类型推断:由上下文决定要构造的具体类型:
- 赋值时:
const a: [3]i32 = .{1,2,3}; - 函数返回:
fn f() @Vector(f32,4) { return .{…}; } - 参数调用:
foo(.{…});根据foo的签名推断
- 赋值时:
常见场景#
| 字面量类型 | 示例 | 等价显式写法 |
|---|---|---|
| 数组 | .{1,2,3} | [3]T{1,2,3} |
| 向量 | (上下文为 @Vector(f32,4)) | @Vector(f32,4){1,2,3,4} |
| 元组/结构体 | .{10, 3.14} | MyStruct{ .a=10, .b=3.14 } 或 MyStruct{10,3.14} |
| 切片 | 传给 fn foo(s: []u8) 的 .{…} | 隐式先构造 [N]u8{…} 再转换为 []u8 |
| error-union | .{ .Err = .{1,2,3} } | E.Err(.{1,2,3}) |
| 枚举分支 | .Some | MyEnum.Some |
二、.field = value:结构体/联合类型中的字段设计ator#
- 作用:显式指定要给哪个字段(或分支)赋值,顺序可任意、可读性高、兼容性好。
- 语法:
.{ .field1 = expr1, .field2 = expr2, … } ```
- 示例:
const Point = struct { x: f32, y: f32 };
// 按字段名初始化 const p: Point = .{ .x = 1.0, // 这里如果使用x = 1.0会编译报错 .y = 2.0, }; ```
支持场景#
| 类型 | 示例 |
|---|---|
| Struct/Union | .{ .a=…, .b=… } |
| Error-union | .{ .NotFound = "x" } |
| Enum 分支带值 | .{ .Some = 42 } |
三、点字面量 vs. 块表达式#
- 块表达式:
{ stmt1; stmt2; expr }→ 值是最后一个表达式的结果 - 点字面量:
.{…}→ 复合类型构造,不含分号,只允许逗号分隔的条目
const x = { 1 + 2 }; // x == 3, 块表达式
const a: [1]i32 = .{ 3 }; // 数组字面量
四、用途一览#
| 用法 | 说明 |
|---|---|
.{ … } | 隐式构造数组/向量/结构体/元组/切片/error-union/enum |
.field = … | 在复合字面量中给指定字段或分支赋值 |
.Variant | 枚举或 error-union 的分支标识符(无值分支) |
.Variant(value) | 枚举有值分支或 error-union 分支的简写(部分 Zig 版本) |
五、示例汇总#
const std = @import("std");
// 1. 向量字面量(SIMD)
fn add(a: @Vector(f32,4), b: @Vector(f32,4)) @Vector(f32,4) {
return .{ a[0]+b[0], a[1]+b[1], a[2]+b[2], a[3]+b[3] };
}
// 2. 数组字面量
const arr: [3]u8 = .{10, 20, 30};
// 3. 切片借用
fn print(s: []u8) void {
for (s) |v| std.debug.print("{} ", .{v});
}
print(.{1,2,3});
// 4. 结构体字面量(字段设计ator)
const Rect = struct { origin: Point, size: Point };
const r: Rect = .{
.origin = .{ .x=0, .y=0 },
.size = .{ .x=100, .y=50 },
};
// 5. 枚举分支
const E = union(enum) { Ok: i32, Err: []u8 };
var e1: E = .Ok; // 无值分支
var e2: E = .{ .Err = .{1,2} }; // 带值分支
总结#
.** 前缀**:区分复合字面量与代码块,让 Zig 能根据上下文自动推断目标类型。.field = …:在结构体/联合类型里显式初始化字段或分支,提高可读性和兼容性。- 应用广泛:数组、向量、元组、结构体、切片、error-union、枚举分支等均可使用同一套简洁语法。 掌握好这些写法,能让你的 Zig 代码在保证类型安全的前提下,更加简洁、清晰、易维护。