”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Zig JS 开发人员的第一印象

Zig JS 开发人员的第一印象

发布于2024-08-29
浏览:338

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();
}

在上面的代码中,我们声明一个错误MyE​​rror(这也可以单独完成)并返回它。
try 的意思是“如果返回错误,则在此处返回”,如下所示:

failingFunction() catch |err| return err;

我相信这种方法是一个很好的组合,可以让我们避免 Go 语言中无尽的 if (err != nil)。

其他亮点

  • 错误是显式的,所有类型都必须声明和处理
  • 处理是当场完成的,而不是在块级别上
  • 由于有效负载捕获,错误可以正确输入并自动完成,从而可以轻松使用诸如 switch 表达式之类的东西。

!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恶作剧

不可否认,我还没有掌握 comptime 的全部可能性。但简而言之,您可以在编译期间运行常规代码。您可以创建仅在这段时间内使用的整个函数,并且可以在必要时返回编译错误。

它非常适合 Zig,因为它是一种可塑性很强的语言。即使类型也是值,这意味着您可以创建、更改和获取有关类型的信息(特别是在 comptime 中)。

Zig 指南中的基本示例:


const a = 5; // 当未指定数字类型时,默认为 comptime_int const b: if (a const a = 5; // When a number type isn't specified, it defaults to comptime_int const b: if (a 编辑经历

我将 VSCode 与官方 Zig 插件(使用 zls)一起使用。我在编辑器中看到的智能感知和错误还有很多不足之处。

“可检测的非法行为” 又名会导致编译错误的非法行为通常不会显示在编辑器中。例如:

const nums = [3]u8{ 2, 1, 3 }; _ = 数字[4]; // 索引越界错误
const a = 5; // When a number type isn't specified, it defaults to comptime_int
const b: if (a 我使用的是 0.14 (dev) master 分支版本,如果它应该可以工作,请在评论中告诉我!

版本声明 本文转载于:https://dev.to/dandeduck/zig-first-impressions-from-a-js-dev-28k4?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    编程 发布于2025-07-02
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否有必要在heap-procal extrable exit exit上进行手动调用“ delete”操作员,但开发人员通常会想知道是否需要手动调用“ delete”操作员。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(H...
    编程 发布于2025-07-02
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-07-02
  • Java中如何使用观察者模式实现自定义事件?
    Java中如何使用观察者模式实现自定义事件?
    在Java 中创建自定义事件的自定义事件在许多编程场景中都是无关紧要的,使组件能够基于特定的触发器相互通信。本文旨在解决以下内容:问题语句我们如何在Java中实现自定义事件以促进基于特定事件的对象之间的交互,定义了管理订阅者的类界面。以下代码片段演示了如何使用观察者模式创建自定义事件: args)...
    编程 发布于2025-07-02
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将其...
    编程 发布于2025-07-02
  • MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    在两个条件下插入或更新或更新 solution:的答案在于mysql的插入中...在重复键更新语法上。如果不存在匹配行或更新现有行,则此功能强大的功能可以通过插入新行来进行有效的数据操作。如果违反了唯一的密钥约束。实现所需的行为,该表必须具有唯一的键定义(在这种情况下为'名称'...
    编程 发布于2025-07-02
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-07-02
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-07-02
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-07-02
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-07-02
  • 在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    mysql-python安装错误:“ mysql_config找不到”“ 由于缺少MySQL开发库而出现此错误。解决此问题,建议在Ubuntu上使用该分发的存储库。使用以下命令安装Python-MysqldB: sudo apt-get安装python-mysqldb sudo pip in...
    编程 发布于2025-07-02
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
    编程 发布于2025-07-02
  • 查找当前执行JavaScript的脚本元素方法
    查找当前执行JavaScript的脚本元素方法
    如何引用当前执行脚本的脚本元素在某些方案中理解问题在某些方案中,开发人员可能需要将其他脚本动态加载其他脚本。但是,如果Head Element尚未完全渲染,则使用document.getElementsbytagname('head')[0] .appendChild(v)的常规方...
    编程 发布于2025-07-02
  • Python环境变量的访问与管理方法
    Python环境变量的访问与管理方法
    Accessing Environment Variables in PythonTo access environment variables in Python, utilize the os.environ object, which represents a mapping of envir...
    编程 发布于2025-07-02

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3