3

是否可以为struct包含类型作为属性创建分配?

例如

示例结构是

const Content = struct {
    content: type,
    name: []const u8,
};

然后,我想分配内存,例如2*Content

我知道我可以使用

const list: [2]CustomElement = .{ Content{ .content = Type, .name = "test" }, Content{ .content = Type, .name = "test" } };

但是如何使用它们来实现相同的目标allocators

这行不通。

  comptime {
        var list = std.ArrayList(Content).init(test_allocator);
        try list.append(Content{ .content = MyType , .name = "test" });
    }

我收到错误

error: parameter of type '*std.array_list.ArrayListAligned(Content,null)' must be declared comptime

简而言之

是否可以为BoxRust 中的类似功能构建功能?

4

1 回答 1

2

据我了解,我不认为目前在语言中可用的分配器(撰写本文时为 0.6.0),通常需要一个“comptime”类型参数,目前允许这样做。

从与 相关的当前文档comptime,关于type类型:

在 Zig 中,类型是一等公民。它们可以分配给变量,作为参数传递给函数,并从函数返回。但是,它们只能用在编译时已知的表达式中,这就是为什么上面代码片段中的参数 T 必须用 comptime 标记的原因。

它看起来确实应该是可能的,因为我认为type必须有一个大小,并且您可能可以分配一个可以容纳它的结构。

看起来comptime分配是一个可能在即将发布的版本中支持的用例:https ://github.com/ziglang/zig/issues/1291 ,但我不确定这将如何与type.

我是 Zig 的新手,所以希望有人能提供更完整的答案 =D

编辑:我确定这不是您要问的问题,但是如果像上面的示例一样,您只在列表中存储具有相同类型的对象,我想您可以使用泛型做些什么?

例如

const std = @import("std");

pub fn main() anyerror!void {
    const cw = ContentWrapper(MyType);

    var list = std.ArrayList(cw.Content).init(std.heap.page_allocator);
    try list.append(cw.Content{ .content = MyType{ .id = 1, .property = 30 }, .name = "First" });
    try list.append(cw.Content{ .content = MyType{ .id = 2, .property = 10 }, .name = "Second" });
}

const MyType = struct {
    id: u8, property: f32
};

fn ContentWrapper(comptime T: type) type {
    return struct {
        pub const Content = struct {
            content: T, name: []const u8
        };
    };
}
于 2020-10-16T12:25:45.377 回答