Поиск по списку структур в zig

#zig

Вопрос:

Я ожидаю, что это вопрос с очень простым ответом о том, как сделать это хорошо в zig.

Я хочу выполнить поиск в списке массивов какой-либо структуры, чтобы найти запись по одному из полей.
В C я бы рассмотрел возможность использования std::find_if и лямбды, но, похоже, в стандартной библиотеке zig нет ничего подобного, если только я что-то не пропустил.

Есть ли лучший / более идиоматичный способ, чем простой цикл, как показано ниже?

 const std = @import("std");

const Person = struct {
    id: i32,
    name: []const u8
};

pub fn main() !void {

    const allocator = std.heap.page_allocator;

    var data = std.ArrayList(Person).init(allocator);
    defer data.deinit();

    try data.append(.{.id = 1, .name = "John"});
    try data.append(.{.id = 2, .name = "Dave"});
    try data.append(.{.id = 8, .name = "Bob"});
    try data.append(.{.id = 5, .name = "Steve"});

    // Find the id of the person with name "Bob"
    //
    // -- IS THERE A BETTER WAY IN ZIG THAN THIS LOOP BELOW? --
    //
    var item_index: ?usize = null;
    for (data.items) | person, index | {
        if (std.mem.eql(u8, person.name, "Bob")) {
            item_index = index;
        }
    }

    std.debug.print("Found index is {}n", .{item_index});


}
 

Ответ №1:

Действительно, в stdlib не так много встроенных утилит. Однако для этого фрагмента кода вы можете объявить найденное index как константу:

 const item_index = for (data.items) |person, index| {
    if (std.mem.eql(u8, person.name, "Bob")) break index;
} else null;