Zig 中 ArrayList 的类型

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

如果我需要使用 zig 的 Arraylist 作为函数的参数或结构的一部分,我需要知道我想要使用的 ArrayList 的类型。我使用一些指南中的这种方式来创建我的列表:

pub fn main() !void {
    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    defer _ = gpa.deinit();

    var list = std.ArrayList(usize).init(gpa.allocator());
    defer list.deinit();
}

我已经有很多问题了:

  • 我应该使用哪个分配器?我真的需要一个变量吗?
  • 延迟有什么作用?
  • 为什么我要传递未使用变量的方程
    gpa
    然后使用它?
  • 为什么我要使用
    deinit()
    变量,然后像往常一样使用它们?不是来自C的
    free()
    吗?

无论如何,我想如果它能正常工作就好了,但后来我意识到我必须知道类型:

std.debug.print("{}", .{@TypeOf(list)});

C:\Users\pasha\Desktop\gam>zig run s.zig
array_list.ArrayListAligned(usize,null)

但是没有

array_list
类型。我搜索并注意到这个函数返回一个未命名的结构:

pub fn ArrayListAligned(comptime T: type, comptime alignment: ?u29) type {
    if (alignment) |a| {
        if (a == @alignOf(T)) {
            return ArrayListAligned(T, null);
        }
    }
    return struct {
        const Self = @This();
        /// Contents of the list. Pointers to elements in this slice are
        /// **invalid after resizing operations** on the ArrayList unless the
        /// operation explicitly either: (1) states otherwise or (2) lists the
        /// invalidated pointers.
        ///
        /// The allocator used determines how element pointers are
        /// invalidated, so the behavior may vary between lists. To avoid
        /// illegal behavior, take into account the above paragraph plus the
        /// explicit statements given in each method.
        items: Slice,
        /// How many T values this list can hold without allocating
        /// additional memory.
        capacity: usize,
        allocator: Allocator,

        . . .
  • 未命名结构的类型是什么,如果我需要这个,或者如果不需要,我什至需要什么?

更具体地说,我想编写俄罗斯方块游戏代码,需要这样的代码:

pub const Tile = struct {
    x: u8,
    y: u8,
    color: rl.Color,

    pub fn TouchingGroundOrTile(self: *Tile, field: *const arralist of Tile) bool {
        for (field.*.items) |*tile|
            //if (it touches)
                return true;
        return false;
    }
};

但更重要的是,我需要将

pub
变量声明为
List
Tile
,如下所示:

pub var field: no_clue_what_the_type_is = undefined;

以便稍后能够

initialize()
并从另一个 .zig 文件中使用。

  • 我认为正确的方法还是有一些真正的 zig 方法可以做到这一点?
list arraylist zig
1个回答
0
投票

这次我更专心了。我注意到,如果函数返回类型,则它们可能是一种类型,我相信:

pub fn main() !void {
    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    defer _ = gpa.deinit();

    var list: std.ArrayListAligned(usize, null) = undefined; //it works!!!
    list = std.ArrayList(usize).init(gpa.allocator());
    defer list.deinit();

    std.debug.print("{}", .{@TypeOf(list)});
}

我也了解了

defer
的作用(感谢@sigod的评论),所以从现在开始不需要帮助。

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