我一直在为我的游戏开发项目学习 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 中你可能会有像 number 这样的类型 |不明确的?您可以使用 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 我使用的是 0.14 (dev) master 分支版本,如果它应该可以工作,请在评论中告诉我!
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3