Мутирование значения в списке массивов в Zig - PullRequest
1 голос
/ 10 апреля 2020

Вопрос Noob:

Я хочу изменить значение, которое существует в списке массивов. Сначала я попытался просто захватить индексированный элемент и напрямую изменить значение его поля.

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 Ответ

0 голосов
/ 13 апреля 2020

var a = arr.items[0];

Это делает копию элемента в arr.items[0].

Если вы хотите ссылку, напишите var a = &arr.items[0]; вместо.

...