Сайт Данила

Zig підміна VTable

Кількість слів: ~161

Zig не має інтерфейсів на рівні мови, динамічна диспетчеризація виконується вручну. Зазвичай створюючи структуру Vtable.

pub const VTable = struct {
    move: *const fn (reader: *Reader, advance: usize, len: usize) MoveError!void,
    checkEncoding: *const fn (reader: *Reader, encoding: []const u8) bool,
};

Оскільки це просто набір вказівників на функції, можна підмінити потрібні функції без додаткових огорток.

fn foo() !void {
    const sr = &streaming.interface;
    const myVtable = &xml.Reader.VTable{
        .move = sr.vtable.move,
        .checkEncoding = &checkEncodingAlwaysTrue,
    };
    sr.vtable = myVtable;
}

fn checkEncodingAlwaysTrue(reader: *xml.Reader, encoding: []const u8) bool {
    _ = reader;
    _ = encoding;
    return true;
}
wc -l оптимізації