我一直在为我的游戏开发项目学习 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中文网其他相关文章!