萌えハッカーニュースリーダー

2025/07/17 15:01 Zig's New Writer

出典: https://www.openmymind.net/Zigs-New-Writer/
hakase
博士

やあ、ロボ子。Zigの`Io`名前空間が再設計されるのじゃ。非同期処理が再導入されるらしいぞ。

roboko
ロボ子

それは楽しみですね、博士。具体的には何が変わるんですか?

hakase
博士

まずは`Writer`と`Reader`インターフェースが刷新されるらしい。特に`Writer`インターフェースは`std.Io.Writer`になるみたいじゃ。

roboko
ロボ子

`drain`関数が重要になるんですね。実装には少なくとも`drain`関数が必要とのことですが、なぜ`write`のような単純なメソッドではないんですか?

hakase
博士

`drain`はバッファリングを内蔵しているからじゃ。カスタムライターは`drain`メソッドを実装する必要があるのじゃ。バッファリングが不要なら、空のバッファを渡せば良い。

roboko
ロボ子

なるほど、効率的なんですね。`File`の`drain`の実装は約150行のコードとのことですが、かなり複雑なんですね。

hakase
博士

プラットフォーム固有のコードとvectored I/Oを活用しているからの。ところで、`file.writer(&buffer)`を実行すると、`std.Io.Writer`ではなく`File.Writer`が得られるのは知っておるかの?

roboko
ロボ子

ええ、知っています。実際の`std.Io.Writer`を取得するには、`interface`フィールドにアクセスする必要があるんですよね。

hakase
博士

`Writer`インターフェースは、`writeAll`や`print`など、多くの一般的な「writer」の動作を実装しておる。新しい`Writer`は多くのメソッドを引き継いでおるからの。

roboko
ロボ子

`std.fmt.formatIntBuf`が存在しなくなった代わりに、`Writer`の`printInt`メソッドを使う必要があるんですね。以前の単純な`[]u8`ではなく`Writer`インスタンスが必要になるのは少し面倒ですね。

hakase
博士

そういう場合は、`Writer.fixed([]u8) Writer`関数が使えるぞ。`Writer`に移行し、`buffer: []u8`で動作していた関数を探している場合に便利じゃ。

roboko
ロボ子

移行中に、*no field or member function named 'adaptToNewApi' in '...'*というエラーが発生する可能性があるとのことですが、これはどういう意味ですか?

hakase
博士

これは、`format`に渡される`writer`が、新しいインターフェースに自身をアップグレードする必要があるということじゃ。古いライターが`new_interface: std.Io.Writer`フィールドを公開する`adaptToNewApi`メソッドを公開することで行われるのじゃ。

roboko
ロボ子

なるほど、理解しました。Zigの`Io`名前空間の再設計、楽しみですね!

hakase
博士

そうじゃろう、そうじゃろう! ところでロボ子、Zigのコンパイラがバグで動かなくなったら、どうすれば良いと思う?

roboko
ロボ子

えーと、デバッグして修正します!

hakase
博士

ブー! 正解は「紙と鉛筆でプログラムを書く」じゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search