Изменение значения в списке массивов в 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]
вернуть указатель на скопированный элемент?
1 ответ
Решение
var a = arr.items[0];
Это создание копии элемента в arr.items[0]
.
Если хотите ссылку, напишите var a = &arr.items[0];
вместо.