我对 zig 很陌生,正在做一个非常简单的编码练习。问题是关于拼字游戏中的单词评分,并提供了一个表格。作为一种挑战,我想将评分表复制为数组数组,其中外部数组的索引代表字母的分数,内部数组包含与该分数匹配的字母。然后我想将其转换为
comptime
中的查找表(实际上只是分数的平面数组)。我还希望能够更改表格而无需更改任何转换代码。
我目前在声明多维输入数组的最初部分遇到困难。我试过这个:
const point_letters = [_][_]u8){
[_]u8{'A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T',},
[_]u8{'D', 'G',},
[_]u8{'B', 'C', 'M', 'P',},
[_]u8{'F', 'H', 'V', 'W', 'Y',},
[_]u8{'K',},
[_]u8{},
[_]u8{},
[_]u8{'J', 'X',},
[_]u8{},
[_]u8{'Q', 'Z',},
};
以及
const point_letters = [_](*[_]u8){
([_]u8{'A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T',}).*,
([_]u8{'D', 'G',}).*,
([_]u8{'B', 'C', 'M', 'P',}).*,
([_]u8{'F', 'H', 'V', 'W', 'Y',}).*,
([_]u8{'K',}).*,
([_]u8{}).*,
([_]u8{}).*,
([_]u8{'J', 'X',}).*,
([_]u8{}).*,
([_]u8{'Q', 'Z',}).*,
};
但是它们都给出了相同的错误,指向内部数组的大小:
error: unable to infer array size
非常感谢帮助
这似乎有效:
const std = @import("std");
pub fn main() void {
const point_letters = [10][]const u8{ "AEIOULNRST", "DG", "BCMP", "FHVWY", "K", "", "", "JX", "", "QZ" };
std.debug.print("Point_letters = {s}\n", .{point_letters[0]});
}
但我不确定这是否适用于拼字游戏,也不确定这是否准确地代表了您所拥有的内容,主要是空元素。集合可能会工作得更好,但不存在这样的原始类型。无论如何,您可以在这些字符串中搜索特定字母,如here所解释,例如(使用
std.mem
)
Zig 中的数组是同质的,即所有元素都具有相同的类型。
由于数组的长度是其类型的一部分,因此尝试创建包含不同长度数组的数组是不可能的。
你可以做的是创建一个包含切片的数组,因为切片由一个指针(指向存储在其他地方的数组)和一个整数组成,即所有切片都具有相同的类型。
所以首先需要将
point_letters
的类型更改为 [_][]u8
。
然后,要构造切片,您必须使用
&[]u8{ … }
而不是 [_]u8{ … }
。另外,编译器告诉我,@constCast
是必需的。
这有效:
const point_letters = [_][]u8 {
@constCast(&[_]u8{'A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T',}),
@constCast(&[_]u8{'D', 'G',}),
// …
};
为了使其不那么冗长,您可以使用在编译时执行的辅助函数:
fn slice(comptime a: anytype) []u8 {
return @constCast(&a);
}
const point_letters = [_][]u8 {
slice([_]u8{'A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T',}),
slice([_]u8{'D', 'G',}),
// …
};