在 zig 语言中使用 var 而不是 const 的结构定义

V.K*_*.K. 9 zig

我现在正在学习zig语言。我见过const类似关键字的结构体的定义

const X = struct {
    n: i32,
};
Run Code Online (Sandbox Code Playgroud)

我的理解是,const是一种互补var,后者允许变化,前者不允许。但是用 定义 struct 意味着什么var

var Y = struct {
    n: i32,
};
Run Code Online (Sandbox Code Playgroud)

这是合法的吗?我编译,所以是的。但这有什么意义和用途呢?

Cri*_*ino 10

编译是因为 zig 是惰性计算的。因为Y未使用,编译器不检查它。

当你引用它时,编译器会抛出一个错误:

试试这个代码

var Y = struct {
    n: i32,
};

comptime {
    @compileLog(Y);
}
Run Code Online (Sandbox Code Playgroud)
error: variable of type 'type' must be constant
    var Y = struct {
    ^
Run Code Online (Sandbox Code Playgroud)

var是声明变量。当您var在全局范围内使用时,会创建一个全局变量。

在你的情况下,

error: variable of type 'type' must be constant
    var Y = struct {
    ^
Run Code Online (Sandbox Code Playgroud)

声明Y为推断类型的变量。在这种情况下,Y是一个类型的变量type

在 zig 中,只有 comptime 类型,即type. 类型为仅 comptime 类型的值只能存在于编译器中,您不能在运行时1 中创建该值。因此,编译器需要始终计算时间已知的值。

所以,因为Y是一个全局变量。您可以在运行时修改它。这就是错误的原因。的值Y不能由二进制生成/存储。


如果只存在于编译器中,则有效

试试这个代码

var Y = struct {
    n: i32,
};
Run Code Online (Sandbox Code Playgroud)
| 10 
Run Code Online (Sandbox Code Playgroud)

附录

1例如,考虑

试试这个代码

comptime {
    var Y = struct {
        n: i32,
    };

    Y = struct {
        count: u32,
    };

    const concrete = Y { .count = 10 };

    @compileLog(concrete.count);
}
Run Code Online (Sandbox Code Playgroud)
error: unable to evaluate constant expression
    std.debug.print("{}\n", .{ compilerKnown(runtimeValue) });
                                             ^
Run Code Online (Sandbox Code Playgroud)

这是一个错误,因为 zig 尝试将函数编译compilerKnown为二进制文件,但类型type是仅 comptime 的,因此无法生成二进制文件。特别是,不能生成机器码return u64

  • 我还有另一个问题,也许我仍然缺乏一些理解......为什么“struct”是用“const”定义的,而函数是用非常不同的语法定义的,如“pub fn x(bool) void”?在我看来,这两种都是类型,它们的定义应该共享相同的语法。为什么没有定义函数,例如“const x = fn(bool) -> void”(如结构)或定义结构“pub struct x { ... }”(如函数)。这个语法设计决策背后是否有任何原因,即它是否允许某些语言功能?或者这或多或少只是一个武断的决定? (3认同)
  • 是的,有一个提案:https://github.com/ziglang/zig/issues/1717 是我们想要的东西。问题是函数指针具有相似的语法,更难以声明函数可导出、内联等。因此,目前,这使语言变得更加复杂,并且与 zig [(Zen)]( 的哲学相反https://ziglang.org/documentation/master/#Zen)。 (2认同)