如何改变 Zig 函数参数?

Eri*_*eim 7 function parameter-passing zig

我发现 Zig 函数参数是恒定的。这意味着我释放 a 的幼稚功能HashMap不起作用。您可以在此处查看代码示例。我想知道最正确的 Zig 方式是否是dict作为函数传递,或者是否有其他方式可以使参数可变。

const Dict = std.StringHashMap;

fn releaseDict(allocator: Allocator, dict:  Dict(i16)) void {
    var iter = dict.iterator();
    while (iter.next()) |entry|
        allocator.free(entry.key_ptr.*);
    dict.deinit();    
}
Run Code Online (Sandbox Code Playgroud)

sig*_*god 8

你不知道。函数参数在设计上是不可变的:

结构体、联合和数组有时可以更有效地作为引用传递,因为根据大小,副本可能会任意昂贵。当这些类型作为参数传递时,Zig 可以选择按值复制和传递,或按引用传递,无论 Zig 决定哪种方式都会更快。这在一定程度上是由于参数是不可变的这一事实而成为可能的。

修改函数参数很容易导致意想不到的结果。如果参数按值传递(创建其副本),则修改它不会修改原始值。

您在这里要做的是:传递一个指向您的哈希映射的指针。例如

fn releaseDict(allocator: Allocator, dict: *std.StringHashMap(i16)) void {
    // ...
}
Run Code Online (Sandbox Code Playgroud)