我试着用通用算法来实现向量代数,最后用迭代器来完成。我发现了两个不明显和意想不到的行为的例子:
fi的结构(实例)的指针fi,则可以像访问p.fi (而不是p.*.fi)一样简单地访问该字段。fun(this: *Self) (其中Self = @This())和结构的实例s,我可以像调用s.fun() (而不是(&s).fun())一样简单地调用该函数。我的问题是:
发布于 2021-07-20 11:57:05
对于1和2,你是正确的。在Zig中,点透明地工作在struct值和struct指针上。类似地,命名空间函数在调用时也会做正确的事情。
我唯一能想到的其他类似行为是数组上使用的[]语法。可以直接对数组值和数组指针进行交替使用。这在某种程度上相当于点在结构上的操作方式。
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 --这是这种行为的三个实例。在所有其他情况下,如果某物请求一个指针,则必须显式地提供它。即使将数组传递给接受片的函数,也必须显式地接受数组的指针。
权威的信息来源是语言参考,但快速检查,它似乎没有一个专门的段落。也许我错过了一些例子。
发布于 2021-10-22 20:47:46
我第一次学习这个语法是通过阅读链接到ziglang.org上的ziglings课程。
在练习43 (pointers5.zig)中
// Note that you don't need to dereference the "pv" pointer to access
// the struct's fields:
//
// YES: pv.x
// NO: pv.*.x
//
// We can write functions that take pointer arguments:
//
// fn foo(v: *Vertex) void {
// v.x += 2;
// v.y += 3;
// v.z += 7;
// }
//
// And pass references to them:
//
// foo(&v1);ziglings课程在一些语言主题上非常深入,所以如果您感兴趣的话,肯定要检查一下。
关于其他语法:正如前面的答案所提到的,您不需要取消引用数组指针。我不确定还有什么其他的(我认为函数指针同样有效,但我只是运行了一些测试,但它们没有)。
https://stackoverflow.com/questions/68454051
复制相似问题