Возможно ли использовать форматирование без буфера в Zig?

Изучая Zig, я наткунлся на такую проблему: я захотел вывести число в stdout, но не тут-то было! stdout.write не поддерживает форматирования. Пришлось лезть в std.fmt (да это можно сделать с помощью std.debug.print, но я решил делать правильно, через std.fs.File.stdout), вот что получилось (после довольно продолжительного труда и гуглинга):

const std = @import("std");

pub fn main() !void {
    var writer = std.fs.File.stdout();
    var buf: [3]u8 = undefined;

    try writer.writeAll(try std.fmt.bufPrint(&buf, "{d} ", .{5}));
}

Но меня смутило, что я не вывожу buf. Дело в том, что, когда я пытался его вывести, выводилось что-то вроде �5 (да, длину buf можно уменьшить, но этот код - упрощённый вариант, в действительности используется цикл for).

Так вот, возможно ли не использовать переменную buf, но всё-таки использовать форматирование?

PS: Желательно также не использовать allocPrint.

UPD: Есть вариант с использование fmt.format, но для получения объекта Writer из std.fs.File.stdout() нужно вызывать метод writer(), которому всё равно надо передавать буфер: вообщем, тоже самое...


Ответы (2 шт):

Автор решения: cxz

Попробуйте std.fmt.format с writer. Должно получится что-то такое:

var writer = std.io.getStdOut().writer();
try std.fmt.format(writer, "{d}\n", .{5});
→ Ссылка
Автор решения: чистов_n

После некоторых исследований, я понял, что, по-видимому, без буфера сделать вывод форматированным нельзя, но возможно использовать пустой буфер и не определять его как отдельную переменную.

Как-то так:

var writer = std.fs.File.stdout().writer(&[_]u8{});  // (1)
try writer.interface.print("{d}", .{5});             // (2)
  1. Получаем объект Writer из stdout, передавая пустой буфер &[_]u8{};
  2. Выводим число 5 с помощью функции writer.interface.print.

Источник: https://github.com/ziglang/zig/issues/24675

→ Ссылка