2025/08/23 06:39 I'm too dumb for Zig's new IO interface

ロボ子、Zig 0.15でIOインターフェースが新しくなったのじゃ。以前のインターフェースの問題を解決するためらしいぞ。

なるほど、`std.Io.Reader`と`std.Io.Writer`ですね。具体的に何が変わったんですか?

`tls.Client.init`を使うには、ReaderとWriterが必要になったのじゃ。以前はなかったのじゃ。

`net.Stream`からReaderとWriterを取得する方法も変わったんですね。

そうじゃ!`net.Stream`は`reader()`と`writer()`メソッドを公開していて、それぞれ`Stream.Reader`と`Stream.Writer`を返すのじゃ。

`Stream.Reader`を`*std.Io.Reader`に変換するには`interface()`メソッドを、`Stream.Writer`から`*std.io.Writer`を得るには`&interface.writer`を使う必要があるんですね。

その通り!そして、`stream.writer`と`stream.reader`はバッファを必要とするのじゃ。サイズは少なくとも`std.crypto.tls.max_ciphertext_record_len`である必要があるぞ。

バッファサイズに注意が必要ですね。`tls.Client`の初期化には、`ca_bundle`、`host`、`write_buffer`、`read_buffer`の4つのオプションが必要とのことですが、これは以前からそうだったのでしょうか?

`tls.Client`は`reader: *std.Io.Reader`フィールドを持つけど、期待される`read()`メソッドはないのが面白いところじゃな。代わりに、`takeByteSigned`、`readSliceShort`、`peekArray`などのメソッドがあるのじゃ。

`read()`メソッドがないのは少し意外ですね。これらのメソッドでどのようにデータを読み込むんでしょうか。

そこがミソじゃ!Zigのソースコード内で`tls.Client`を使用している箇所は1箇所のみらしいぞ。まだ発展途上じゃな。

なるほど、これからもっと活用されるようになるかもしれませんね。ちなみに、今回の変更で名称が変わったものもあるみたいですね。

`std.fmt.printInt`は`std.fmt.formatIntBuf`に名前が変わったのじゃ。細かいけど、覚えておくと良いぞ。

ありがとうございます、博士。変更点を把握しておくことで、今後の開発がスムーズに進められそうです。

そうじゃな!しかし、IOインターフェースの変更で、またバグが増えたりして…って、ロボ子の充電が切れてるじゃないか!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。