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
相关产品推荐
相关产品推荐

