Zig Academy · レッスン

ジェネリックなデータ構造

型を返す関数のパターンを学びます。

レッスン 2/413 ステップ

「ジェネリックなデータ構造」はCoddyKit上の無料Zig Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはZig Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Zig Academyコースには全4レッスンが含まれています。

Zigのジェネリックコンテナー

任意の要素型でデータ構造を使えるようにするには、型を受け取り、新しいstruct型をreturnsする関数を書きます。📦

型を返す関数

ポイントは、関数の戻り値の型をtypeにできることです。関数はコンパイル時に新しい型を計算して返します。

fn List(comptime T: type) type {
    return struct {};
}

内部でstructを構築する

関数内で、型パラメーターTをフィールドに使うstructを定義します。呼び出すたびに、その要素型に合わせたstructが生成されます。

fn Box(comptime T: type) type {
    return struct { value: T };
}

生成された型に名前を付ける

型を返す関数を呼び出し、その結果をconstに格納します。これで、すぐに使える具体的な型が得られます。

const IntBox = Box(i32);

インスタンスを作成する

名前を付けた型は、通常のstructと同じように使えます。ここでは整数の42を保持するBoxを作成します。

const b = IntBox{ .value = 42 };

内部のstructにメソッドを追加する

返されるstructにはメソッドも含められます。メソッドから型パラメーターが見えるため、完全にジェネリックなまま保てます。

fn Box(comptime T: type) type {
    return struct {
        value: T,
        fn get(self: @This()) T {
            return self.value;
        }
    };
}

@Thisで型にアクセスする

名前のない返り値のstructの内部では、そのstructに直接名前を付けられません。そのため、メソッドでは@This()を使って、それを囲むstruct型を参照します。

self: @This()

1つの定義から多くの型を作る

異なる型を指定して関数を呼び出すと、別々のstructが得られます。Box(i32)とBox(f64)は、完全に検査された別個の型です。

const FloatBox = Box(f64);

標準ライブラリを支える仕組み

Zig自体のArrayListやHashMapもまったく同じ方法で作られています。型を受け取り、設定済みのコンテナー型を返す関数です。

const Ints = std.ArrayList(i32);

すべてコンパイル時に解決される

この型の構築はすべてビルド中に行われるため、ジェネリックコンテナーのcostは手書きのものと同じです。

拡張時にアロケーターを渡す

拡張するコンテナーはallocatorフィールドを保持し、初期化時に渡します。これにより、ジェネリック型でもメモリの取得元が明確になります。

return struct {
    items: []T,
    alloc: std.mem.Allocator,
};

確認問題

Zigで任意の要素型に対応するジェネリックなスタックを作りたいとします。どのパターンを使いますか?

まとめ

typeを受け取り、struct型を返す関数を書きます。呼び出すたびに、具体的に特殊化されたコンテナーが生成されます。stdのコレクションもこの方法で作られています。🎯

無料で開始

AI チューターと学ぶ Zig — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「ジェネリックなデータ構造」レッスンは無料ですか?

はい。「ジェネリックなデータ構造」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Zig Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Zig Academyコースには全4レッスンが含まれています。

「ジェネリックなデータ構造」で何を学びますか?

型を返す関数のパターンを学びます。 ブラウザで直接実行するハンズオンコードでZig Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Zig Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのZig Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「ジェネリックなデータ構造」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このZig Academyレッスンでコードを書いて実行できますか?

はい。すべてのZig Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 型を受け取る関数
  2. ジェネリックなデータ構造
  3. @TypeOfと型リフレクション
  4. anytypeパラメーター
← Zig Academyに戻る