我知道我可以通过以下方式创建通用函数:
fn func(T: type, value1: T, value2: T) i8,
但是,我正在探索函数如何返回函数的想法。
下面是一个例子。在通用结构体中创建函数后,我返回指向该函数的指针。
有更好的办法吗?
const std = @import("std");
fn DefaultCompareFn(T: type) *const fn(T, T) i8 {
const DC = struct {
func: *const fn(T, T) i8 = @This().defaultCompareFn,
fn defaultCompareFn(value1: T, value2: T) i8 {
if (value1 > value2) {
return 1;
} else if (value1 < value2) {
return -1;
}
return 0;
}
};
const dc = DC{};
return dc.func;
}
test "Fn" {
const func = DefaultCompareFn(i8);
std.debug.print("{}\n", .{func(5, 6)});
}
在这个简单的示例中,最好创建一个接受任意类型参数的函数,第二个参数将使用内置函数 @TypeOf 来确保两个参数的类型相同。 我已经修改了下面的示例并进行了更改,并更新了单元测试,使其对于 Zig 来说更加惯用。
const std = @import("std");
fn defaultCompare(lhs: anytype, rhs: @TypeOf(lhs)) i8 {
if (lhs > rhs) {
return 1;
} else if (lhs < rhs) {
return -1;
}
return 0;
}
test "Fn" {
try std.testing.expectEqual(defaultCompare(5, 16), -1);
try std.testing.expectEqual(defaultCompare(6, 1), 1);
try std.testing.expectEqual(defaultCompare(5, 5), 0);
}