我试图用通用算法来实现向量代数,最后却选择了迭代器。我发现了两个不明显和意外行为的例子:
p指向带有 field 的结构(实例)的指针fi,我可以像p.fi(而不是p.*.fi)一样简单地访问该字段fun(this: *Self)(其中Self = @This())和结构体的实例s,我可以像s.fun()(而不是(&s).fun())一样简单地调用该函数我的问题是:
对于1和2,你是正确的。在 Zig 中,点透明地适用于结构值和结构指针。同样,命名空间函数在调用时也会做正确的事情。
我能想到的唯一其他类似行为是[]数组上使用的语法。您可以直接在数组值上使用,也可以在数组指针上互换使用。这在某种程度上相当于点在结构上的操作方式。
const std = @import("std");
pub fn main() !void {
const arr = [_]u8{1,2,3};
const foo = &arr;
std.debug.print("{}", .{arr[2]});
std.debug.print("{}", .{foo[2]});
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这是这种行为的唯一三个实例。在所有其他情况下,如果某些内容需要指针,您必须显式提供它。即使将数组传递给接受切片的函数,也必须显式获取数组的指针。
权威的信息来源是语言参考,但快速查了一下,似乎没有专门的段落。也许有一些我错过的例子。
https://ziglang.org/documentation/0.8.0/