有人可以解释一下这是如何工作的:const print = @import( "std" ).debug.print;



这个const print变量如何表现得像一个函数?

const print = @import("std").debug.print;
print("hello, world", .{});

我知道你可以给变量赋值表达式。但这似乎表现得像c/c++中的预编译器宏,我不会猜到的。是因为"在comptime表达式中声明的所有变量都是隐式的comptime变量">和@使其成为comptime表达式,因此在编译之前对其进行计算,就像c中的宏一样?有人能详细说明一下吗?这似乎是一个非常强大的功能。

@不表示comptime表达式;而@为Zig中的内置函数加上前缀。@import返回一个结构体,该结构体提供了对导入文件中公开声明的访问。

表达式@import("std").debug.print求值为标准库文件std/debug.zig中定义的print函数;在发布的代码中,分配给print的不是表达式,而是函数。也就是说,发布的代码可以工作,因为OP代码中的print实际上是一个函数。通过运行下面的代码可以看到:

const print = @import("std").debug.print;
pub fn main() void {
print("@TypeOf print: {}n", .{ @TypeOf(print) });
}

结果:

$ zig run print_type.zig 
@TypeOf print: fn(comptime []const u8, anytype) void

函数赋值

OP要求另一个将未导入的函数赋值给标识符的示例:

const print = @import("std").debug.print;
fn my_function(msg: []const u8) void {
print("{s}n", .{ msg });
}
const my_function_alias = my_function;
pub fn main() void {
const another_function_alias = my_function;
const yet_another_function_alias = my_function_alias;
my_function("mf");
my_function_alias("mfa");
another_function_alias("afa");
yet_another_function_alias("yafa");
}

程序输出:

$ zig run function_assignment.zig 
mf
mfa
afa
yafa

最新更新