用 var 而不是 zig 语言中的 const 的结构定义
struct definition with var instead of const in zig language
我现在正在学习 zig
语言。我见过带有 const
关键字的结构定义,例如
const X = struct {
n: i32,
};
我的理解是const
是对[=15=的一种补充],后者允许改变,前者不允许。但是用 var
定义结构意味着什么?
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
是声明变量。当您在全局范围内使用 var
时,会创建一个全局变量。
在你的情况下,
var Y = struct {
n: i32,
};
将 Y
声明为推断类型的变量。在这种情况下,Y
是类型 type
.
的变量
在zig中,只有comptime-only类型,即type
的情况。类型为 comptime-only 类型的值只能存在于编译器中,不能在运行时1 中创建值。因此,编译器需要始终编译时间已知该值。
所以,因为Y
是一个全局变量。您可以在运行时修改它。这就是错误的原因。 Y
的值不能被二进制generated/stored。
如果只存在于编译器中,就可以工作
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 尝试将函数 compilerKnown
编译成二进制文件,但是类型 type
是 comptime-only,因此无法生成二进制文件。特别是,无法为 return u64
.
生成机器代码
我现在正在学习 zig
语言。我见过带有 const
关键字的结构定义,例如
const X = struct {
n: i32,
};
我的理解是const
是对[=15=的一种补充],后者允许改变,前者不允许。但是用 var
定义结构意味着什么?
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
是声明变量。当您在全局范围内使用 var
时,会创建一个全局变量。
在你的情况下,
var Y = struct {
n: i32,
};
将 Y
声明为推断类型的变量。在这种情况下,Y
是类型 type
.
在zig中,只有comptime-only类型,即type
的情况。类型为 comptime-only 类型的值只能存在于编译器中,不能在运行时1 中创建值。因此,编译器需要始终编译时间已知该值。
所以,因为Y
是一个全局变量。您可以在运行时修改它。这就是错误的原因。 Y
的值不能被二进制generated/stored。
如果只存在于编译器中,就可以工作
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 尝试将函数 compilerKnown
编译成二进制文件,但是类型 type
是 comptime-only,因此无法生成二进制文件。特别是,无法为 return u64
.