问题描述
我试图用通用算法来实现向量代数,但最终还是使用了迭代器。我发现了两个不明显和意外行为的例子:
- 如果我有指向字段为
p
的结构(实例)的指针fi
,我可以像p.fi
一样简单地访问该字段(而不是p.*.fi
)立> - 如果我有一个“成员”函数
fun(this: *Self)
(其中Self = @This()
)和结构体的实例s
,我可以像s.fun()
一样简单地调用该函数(而不是(&s).fun()
)
我的问题是:
- 是否在某处记录(或以任何方式提及)?我浏览了 ziglearn.org 的语言参考和指南,但没有找到任何内容
- 我们在这些示例中观察到了什么?两种特定情况的语法糖,还是有更一般的规则可以推断出这种行为?
- 是否有更多关于奇怪指针行为的例子?
解决方法
对于 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]});
}
AFAIK 这些是此行为的唯一三个实例。在所有其他情况下,如果某些东西需要指针,您必须明确提供它。即使将数组传递给接受切片的函数,也必须显式获取数组的指针。
权威信息来源是语言参考,但快速检查,似乎没有专门的段落。也许我错过了一些例子。
https://ziglang.org/documentation/0.8.0/