在 Zig 中改变数组列表中的值
Mutating a value in an array list in Zig
菜鸟问题:
我想改变数组列表中存在的值。我最初尝试只获取索引项并直接更改其字段值。
const Foo = struct {
const Self = @This();
foo: u8,
};
pub fn main() anyerror!void {
const foo = Foo {
.foo = 1,
};
const allocator = std.heap.page_allocator;
var arr = ArrayList(Foo).init(allocator);
arr.append(foo) catch unreachable;
var a = arr.items[0];
std.debug.warn("a: {}", .{a});
a.foo = 2;
std.debug.warn("a: {}", .{a});
std.debug.warn("arr.items[0]: {}", .{arr.items[0]});
//In order to update the memory in [0] I have to reassign it to a.
//arr.items[0] = a;
}
然而,结果出乎我的意料:
a: Foo{ .foo = 1 }
a: Foo{ .foo = 2 }
arr.items[0]: Foo{ .foo = 1 }
我原以为 arr.items[0]
现在等于 Foo{ .foo = 2 }
。
这可能是我对切片的误解。
难道a
和arr.items[0]
指向的不是同一个内存吗?
arr.items[0]
return 是指向复制项目的指针吗?
var a = arr.items[0];
即复制 arr.items[0]
中的项目。
如果您需要参考,请改写 var a = &arr.items[0];
。
菜鸟问题:
我想改变数组列表中存在的值。我最初尝试只获取索引项并直接更改其字段值。
const Foo = struct {
const Self = @This();
foo: u8,
};
pub fn main() anyerror!void {
const foo = Foo {
.foo = 1,
};
const allocator = std.heap.page_allocator;
var arr = ArrayList(Foo).init(allocator);
arr.append(foo) catch unreachable;
var a = arr.items[0];
std.debug.warn("a: {}", .{a});
a.foo = 2;
std.debug.warn("a: {}", .{a});
std.debug.warn("arr.items[0]: {}", .{arr.items[0]});
//In order to update the memory in [0] I have to reassign it to a.
//arr.items[0] = a;
}
然而,结果出乎我的意料:
a: Foo{ .foo = 1 }
a: Foo{ .foo = 2 }
arr.items[0]: Foo{ .foo = 1 }
我原以为 arr.items[0]
现在等于 Foo{ .foo = 2 }
。
这可能是我对切片的误解。
难道a
和arr.items[0]
指向的不是同一个内存吗?
arr.items[0]
return 是指向复制项目的指针吗?
var a = arr.items[0];
即复制 arr.items[0]
中的项目。
如果您需要参考,请改写 var a = &arr.items[0];
。