Zig自定义Option类型:能否省略map方法的显式R类型参数?
在Zig中让Option的map方法自动推导返回类型R
当然可以,借助Zig的编译期类型推导特性,完全能让map方法自动推导返回类型R,无需显式传递。只需要调整map函数的实现,利用anytype和@TypeOf来完成类型推导。
修改后的Option类型实现
fn Opt(comptime T: type) type { return union(enum) { some: T, none: void, pub fn of(x: T) Opt(T) { return .{ .some = x }; } pub fn map(self: @This(), comptime mapFn: fn (x: T) anytype) Opt(@TypeOf(mapFn(@as(T, undefined)))) { const R = @TypeOf(mapFn(@as(T, undefined))); return switch (self) { .none => .none, .some => Opt(R).of(mapFn(self.some)), }; } }; }
简化后的调用示例
const opt: Opt(i32) = Opt(i32).of(101); // 无需再传递f32类型参数 const newOpt = opt.map(struct { fn f(x: i32) f32 { return 1.0 + @intToFloat(f32, x); } }.f);
实现原理
- 用
anytype声明mapFn的返回类型,告诉Zig在编译期自动推导这个函数的返回类型。 - 通过
@TypeOf(mapFn(@as(T, undefined)))获取mapFn的返回类型:@as(T, undefined)用来构造一个编译期合法的T类型参数,不需要实际运行函数就能拿到返回类型。 - 把推导出来的类型
R用来构造返回的Opt(R)实例,完成map操作。
这样调整后,map方法就和标准库中的同类方法用法一致,代码更简洁直观。
内容的提问来源于stack exchange,提问作者leetwinski
相关产品推荐
相关产品推荐

