我一直在為我的遊戲開發專案學習 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等
誠然,我還沒有掌握 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中文網其他相關文章!