首頁 >web前端 >js教程 >Zig JS 開發人員的第一印象

Zig JS 開發人員的第一印象

PHPz
PHPz原創
2024-08-24 22:31:38981瀏覽

Zig First Impressions from a JS Dev

我一直在為我的遊戲開發專案學習 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)。

其他亮點

  • 錯誤是明確的,所有類型都必須聲明和處理
  • 處理是當場完成的,而不是在區塊層級
  • 由於有效負載捕獲,錯誤可以正確輸入並自動完成,從而可以輕鬆使用諸如 switch 表達式之類的東西。

!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等

Comptime惡作劇

誠然,我還沒有掌握 comptime 的全部可能性。但簡而言之,您可以在編譯期間運行常規程式碼。您可以建立僅在這段時間內使用的整個函數,並且可以在必要時傳回編譯錯誤。

它非常適合 Zig,因為它是一種可塑性很強的語言。甚至類型也是值,這意味著您可以建立、更改和獲取有關類型的信息(特別是在 comptime 中)。

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

編輯經歷

我將 VSCode 與官方 Zig 外掛程式(使用 zls)一起使用。我在編輯器中看到的智慧感知和錯誤還有很多不足之處。

「可偵測的非法行為」 又稱會導致編譯錯誤的非法行為通常不會顯示在編輯器中。例如:

const nums = [3]u8{ 2, 1, 3 };
_ = nums[4]; // Index out of bounds error

我使用的是 0.14(dev)主分支版本,如果它應該可以工作,請在評論中告訴我!

以上是Zig JS 開發人員的第一印象的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn