openlang

可以绑定函数的 void 结果吗?

这怎么能通过?

const std = @import("std");

pub fn main() !void {
    const outcome =
        std.debug.print("Hello, world\n", .{});
    _ = outcome;
}

std.debug.print() 的结果是 void,但把结果绑定到 outcome 时,Zig 并不报错。

我在做项目时遇到了这个问题,当时误以为某个第三方库的 API 会返回值,其实并不会。后来用 {s} 把这个结果格式化成字符串时,编译器才报错,但从那里找到最初的错误假设花了些时间。

什么情况下把 void 存进变量会有用?

从英语翻译查看原文

后续讨论 4

顺着彼此的依据读下去
  1. 固定链接

    这能简化在 comptime 决定值是否存在的代码。

    与其拆解函数类型,还可能要穿过好几层错误联合,不如检查绑定了结果的变量类型,简单得多,这里很有用。

    如果函数还做别的事,你可能无论如何都需要调用它。

    允许一个除此之外没什么用的值,并没有多大坏处。

    从英语翻译查看原文
  2. 固定链接

    我想知道哪些项目需要在 test 块中“丢弃”,又应该在什么时候做?比如 std.zig 模块的源代码末尾有这样的代码。

    test {
        _ = Ast;
        _ = AstRlAnnotate;
        _ = BuiltinFn;
        _ = Client;
        _ = ErrorBundle;
        _ = LibCDirs;
        _ = LibCInstallation;
        _ = Server;
        _ = TokenSmith;
        _ = WindowsSdk;
        _ = number_literal;
        _ = primitives;
        _ = string_literal;
        _ = system;
        _ = target;
        _ = c_translation;
        _ = llvm;
        _ = @import("zig/parser_fuzz.zig");
    }

    如果是库,我导入的每个模块都应该放进去吗?如果不是,哪些模块需要这样处理?

    从英语翻译查看原文
  3. 固定链接

    如果是库,我导入的每个模块都应该放进去吗?如果不是,哪些模块需要这样处理?

    只有根文件的测试会隐式运行,其他文件/模块/命名空间需要引用包含测试的命名空间。根文件内含有测试的 struct/union/enum 也一样,都需要引用。

    说清楚一点,提及 sample.member 只引用 sample.member,并不引用 sample,而 _ = sample 引用的是 sample 本身。

    从英语翻译查看原文

同一个问题的其他角度

  1. 怎样继承另一个类里面的类?

    你好, 在一个我无法修改代码的包里,类的层次结构如下。 我想给 Inner 加个方便使用的包装,但因为 Inner 依赖外层实例,目前只做到把它放进外层类的子类里面。 可惜,在多个地方继承 Outer,就意味着每个新子类里都得重复这个方便使用的 ca…

    回复 1最近活动 scala
  2. 比较 Lean4 中的 have 和 let 绑定

    我发现下面两个表达式 以及 行为完全相同。证明定理时也是这样。 它们可以互换吗?区别在哪里?

    回复 3最近活动 lean-4
  3. 初始化以字符串数组为值的 TypeScript Map

    我在创建一个 Map,其中每个条目都保存字符串数组。怎样在一条语句中同时声明类型并完成初始化? 我(天真地)这样试了一下。 结果是下面这个错误。

    回复 2最近活动 typescript