我有以下类型:
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 };
我在 Zig 中进行原型设计时遇到了很大的麻烦,并且我在一些本应相对容易做的事情上浪费了相当多的时间。我想以某种方式初始化一个文字切片,这样我就可以通过执行以下操作来使用它:
var x = &[_]ParsedVal{
.{ .String = "string here" },
.{ .Integer = 55 },
.{ .List = []const ParsedVal{ .String = "asdfsdf" } },
};
该代码适用于
.String
和 .Integer
,但是当我尝试使用 .List
运行程序时,出现以下错误:
error: type '[]const main.ParsedVal' does not support struct initialization syntax
.{ .List = []const ParsedVal{ .String = "asdfsdf" } },
~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
我尝试了许多不同的变体来初始化
.List
字段,但没有成功。
我怎样才能初始化一个文字切片,然后像这样循环它:
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}),
}
}
强制切片的数组文字的正确语法是:
&[_]TheType{ value1, value2, ... }
每个值都需要自己的初始化语法。例如。
ParsedVal{ .String = "..." }
或者,使用
匿名联合文字语法,
.{ .String = "..." }
。初始化 .List
字段的更正语法如下所示:
.{ .List = &[_]ParsedVal{ .{ .String = "asdfsdf" } } }