繁体   English   中英

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

[英]struct definition with var instead of const in zig language

我现在正在学习zig语言。 我已经看到了带有const关键字的结构定义,例如

const X = struct {
    n: i32,
};

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

var Y = struct {
    n: i32,
};

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

编译是因为 zig 是惰性评估的。 因为没有使用Y ,所以编译器不会检查它。

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

试试这个代码

var Y = struct {
    n: i32,
};

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

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

在你的情况下,

var Y = struct {
    n: i32,
};

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

在 zig 中,只有 comptime 类型,即type的情况。 类型为 comptime-only 类型的值只能存在于编译器中,您不能在运行时1中创建该值。 因此,编译器需要始终知道该值。

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


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

试试这个代码

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

    Y = struct {
        count: u32,
    };

    const concrete = Y { .count = 10 };

    @compileLog(concrete.count);
}
| 10 

附录

1例如,考虑

试试这个代码

const std = @import("std");

fn compilerKnown(arg: []const u8) type {
   return u64;
}

pub fn main() !void {
    var runtimeValue = "hello world";

    std.debug.print("{}\n", .{ compilerKnown(runtimeValue) });
}
error: unable to evaluate constant expression
    std.debug.print("{}\n", .{ compilerKnown(runtimeValue) });
                                             ^

这是一个错误,因为 zig 尝试将 function compilerKnown已知为二进制,但类型type为 comptime-only,因此无法生成二进制。 特别是,无法为return u64生成机器代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM