Zig - 初始化联合枚举的切片文字

问题描述 投票:0回答:1

我有以下类型:

    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}),
        }
    }
initialization slice unions literals zig
1个回答
0
投票

强制切片的数组文字的正确语法是: &[_]TheType{ value1, value2, ... }

每个值都需要自己的初始化语法。例如。 
ParsedVal{ .String = "..." }

或者,使用

匿名联合文字
语法,.{ .String = "..." }
初始化 

.List

字段的更正语法如下所示:

.{ .List = &[_]ParsedVal{ .{ .String = "asdfsdf" } } }

© www.soinside.com 2019 - 2024. All rights reserved.