作为一个学习练习,我正在尝试通过在 std 库中的哈希图上构建来在 zig 中创建一个集合类型。
fn Set(comptime T: type) type {
return struct {
hashMap : hashMapType,
const hashMapType: type = std.hash_map.AutoHashMap(T, T);
const Self = @This();
fn init(allocator: std.mem.Allocator) Self {
return Self{
.hashMap = hashMapType.init(allocator),
};
}
fn put(self: Self, element: T) std.mem.Allocator.Error!void {
return try self.hashMap.put(element, element);
}
fn count(self: Self) hashMapType.Size {
return self.hashMap.count();
}
};
}
当我尝试编译使用该put
函数的代码时,收到错误消息:
error: expected type '*hash_map.HashMap(set_experiment.rootPair,set_experiment.rootPair,hash_map.AutoContext(set_experiment.rootPair),80)', found '*const hash_map.HashMap(set_experiment.rootPair,set_experiment.rootPair,hash_map.AutoContext(set_experiment.rootPair),80)'
return try self.hashMap.put(element, element);
~~~~~~~~~~~~^~~~
set_experiment.zig:26:27: note: cast discards const qualifier
/usr/lib/zig/std/hash_map.zig:551:26: note: parameter type declared here
pub fn put(self: *Self, key: K, value: V) Allocator.Error!void {
^~~~~
显然,我可以看到它抱怨是因为内部哈希图被假定为 const。我无法弄清楚从语法和惯用性上来说正确的修复方法是什么。