在 Zig 中,如何从另一个函数返回一个函数

问题描述 投票:0回答:1

我知道我可以通过以下方式创建通用函数:

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)});
}

generics zig
1个回答
0
投票

在这个简单的示例中,最好创建一个接受任意类型参数的函数,第二个参数将使用内置函数 @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);
}
© www.soinside.com 2019 - 2024. All rights reserved.