返回文章列表

文章

Zig中的“.前缀”的用法

目录
  1. 下面是对 Zig 中 “.” 前缀(dot literal)及其在复合字面量和字段设计ator里用法的完整整合说明。
  2. 一、.{ … }:通用复合字面量前缀
  3. 常见场景
  4. 二、.field = value:结构体/联合类型中的字段设计ator
  5. 支持场景
  6. 三、点字面量 vs. 块表达式
  7. 四、用途一览
  8. 五、示例汇总
  9. 总结

下面是对 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})
枚举分支.SomeMyEnum.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 代码在保证类型安全的前提下,更加简洁、清晰、易维护。