You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Zig中如何初始化枚举联合类型的切片字面量?

Zig中ParsedVal切片字面量的正确初始化方法

问题背景

定义了以下Zig类型:

const ParsedValType = enum { String, Integer, List, Dict };
const ParsedVal = union(enum) {
    String: []const u8,
    Integer: i64,
    List: []const ParsedVal,
    Dict: []DictEntry,
};
const DictEntry = struct { k: []const u8, v: ParsedVal };

尝试初始化ParsedVal类型的切片字面量时,.List字段初始化报错:

var x = &[_]ParsedVal{
        .{ .String = "string here" },
        .{ .Integer = 55 },
        .{ .List = []const ParsedVal{ .String = "asdfsdf" } }, // 此处报错
    };

错误信息:

error: type '[]const main.ParsedVal' does not support struct initialization syntax
.{ .List = []const ParsedVal{ .String = "asdfsdf" },
~^~~~~~~

错误原因

切片字面量[]const ParsedVal{ ... }的元素必须是完整的ParsedVal实例初始化语法,不能直接写.String = "xxx"(这是union字段的简写,缺少外层的.{ ... }包裹)。同时,Zig中直接用[]const T{ ... }无法创建切片字面量,需要先创建数组字面量[_]T{ ... },再通过&取地址转换为切片。

正确写法

将.List字段的初始化代码修改为:

var x = &[_]ParsedVal{
    .{ .String = "string here" },
    .{ .Integer = 55 },
    .{ .List = &[_]ParsedVal{ .{ .String = "asdfsdf" } } },
};

完整测试代码

包含遍历打印逻辑的可运行代码:

const std = @import("std");

const ParsedValType = enum { String, Integer, List, Dict };
const ParsedVal = union(enum) {
    String: []const u8,
    Integer: i64,
    List: []const ParsedVal,
    Dict: []DictEntry,
};
const DictEntry = struct { k: []const u8, v: ParsedVal };

pub fn main() void {
    var x = &[_]ParsedVal{
        .{ .String = "string here" },
        .{ .Integer = 55 },
        .{ .List = &[_]ParsedVal{ .{ .String = "asdfsdf" } } },
        .{ .Dict = &[_]DictEntry{ .{ .k = "test_key", .v = .{ .Integer = 200 } } } },
    };

    for (x) |val| {
        switch (val) {
            .String => |s| std.debug.print("string: {s}\n", .{s}),
            .Integer => |d| std.debug.print("integer: {d}\n", .{d}),
            .List => |l| std.debug.print("list: {any}\n", .{l}),
            .Dict => |d| std.debug.print("dictionary: {any}\n", .{d}),
        }
    }
}

运行后输出:

string: string here
integer: 55
list: { main.ParsedVal{ .String = "asdfsdf" } }
dictionary: { main.DictEntry{ .k = "test_key", .v = main.ParsedVal{ .Integer = 200 } } }

内容的提问来源于stack exchange,提问作者unknownerror

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 17:56:30