首页 >web前端 >js教程 >Zig JS 开发人员的第一印象

Zig JS 开发人员的第一印象

PHPz
PHPz原创
2024-08-24 22:31:38982浏览

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