私はゲーム開発プロジェクトのために zig を学習しています。詳細については、ここを参照してください。これらは、主に JS/TS の最近の経験から得た、この言語に対する私の最初の (ほとんど肯定的な) 印象です。
エラーは価値です - 現時点では、例外が最善ではないというのが非常に一般的な意見です。これらは非表示の制御フローを作成しますが、JavaScript では宣言することさえできません。これにより、アプリケーションが非常に不安定になります。
Zig はエラー列挙型と優れた構文糖衣を使用して、簡単で楽しいエラー処理を実現します。例:
fn failingFunction() error{MyError}!void { return error.MyError; } pub fn main() !void { try failingFunction(); }
上記のコードでは、エラー MyError (これは個別に実行することもできます) を宣言し、それを返します。
try は、次のように「エラーが返された場合はここに返す」ことを意味します。
failingFunction() catch |err| return err;
このアプローチは素晴らしい組み合わせであり、Go ランドでの無限の if (err != nil) から私たちを救ってくれると信じています。
その他のハイライト:
!void 構文 - !戻り値の型とエラーの型の間の結合を作成するために使用されます。 Zig は、! の前にエラーを追加しないことをサポートしています。これにより、関数から実際に返されるすべてのエラーの結合が作成されることになります。
実際には、この構文は役に立たないと思います。少なくとも私の IDE の経験では、この場合はインテリセンスが得られず、関数がわかりにくくなります。 何を返すのか教えてください!
main() 関数でのみ役に立ちます。
TS では数値 | のような型がどのように使用されるかはご存知でしょう。未定義? if または何らかのロジックを使用して型を必要なものに絞り込むと、TS が新しい型を自動的に正しく表示します。
このアプローチには簡単ですが、次のような問題があります。
Zig では、これを「ペイロード キャプチャ」で行います。結果の型を使用して新しい不変変数を「キャプチャ」することも、作成することもできます。例:
const maybe_num: ?usize = 10; // `?` Means it can be `null` if (maybe_num) |num| { // Use num }
何が起こっているかは非常に明らかです!さらに、変数は不変ですが、本当に変更する必要がある場合は、代わりに値へのポインタをキャプチャできます。
このメカニズムは、for、switch、catch などを含む言語全体で使用できることにも言及する価値があります。
確かに、私はまだコンプタイムの可能性を完全には理解していませんでした。しかし要するに、コンパイル中に通常のコードを実行できます。この期間中にのみ使用される関数全体を作成でき、必要に応じてコンパイル エラーを返すことができます。
Zig は非常に順応性の高い言語であるため、Zig に非常に適しています。型も値です。つまり、型に関する情報を作成、変更、取得できることを意味します (特に計算時)。
Zig ガイドからの基本的な例:
const a = 5; // When a number type isn't specified, it defaults to comptime_int const b: if (a < 10) f32 else i32 = 5; // b: f32 after compilation
私は公式 Zig プラグイン (zls を使用) で VSCode を使用しています。エディターに表示されるインテリセンスとエラーには、まだ改善の余地がたくさんあります。
「検出可能な不正な動作」、つまりコンパイル エラーを引き起こす不正な動作は、通常、エディタには表示されません。例:
const nums = [3]u8{ 2, 1, 3 }; _ = nums[4]; // Index out of bounds error
私は 0.14 (dev) マスター ブランチ バージョンを使用しています。これが機能する場合は、コメントで知らせてください。
以上がZig JS 開発者からの第一印象の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。