如果我需要使用 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 文件中使用。
这次我更专心了。我注意到,如果函数返回类型,则它们可能是一种类型,我相信:
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的评论),所以从现在开始不需要帮助。