Nim中如何在proc属性赋值时设置参数初始值(不在定义行)
实现方法
你不需要修改原有myproc的定义,所有参数初始值绑定逻辑都可以在赋值环节完成,不会改动原过程的定义代码,符合要求。
闭包直接绑定(无需修改原对象类型)
如果要保持原有x类型的y字段签名(即仍然要求传入两个int参数),直接在赋值行写匿名闭包,在闭包内部固定参数值即可。比如要固定a=1,无论调用时第一个参数传什么,实际传入myproc的a都为1:
type x = object y: proc(a,b:int) proc myproc(a,b:int) = echo a var tmp = new x # 赋值行直接完成a=1的绑定,未修改myproc的任何代码 tmp.y = proc(a, b: int) = const aDefault = 1 myproc(aDefault, b) tmp.y(999, 5) # 实际执行myproc(1,5),输出1
类型声明默认值(支持单参数调用)
如果你想实现示例里tmp.y(5)的单参数调用效果(即调用时不传a就默认用1,传了a就用传入值),只需要在定义x类型的y字段时给a加上默认值即可——默认值是调用方的约定,不需要修改myproc的定义:
type x = object # 仅在字段类型上声明a的默认值,不改动原myproc代码 y: proc(a: int = 1; b: int) proc myproc(a,b:int) = echo a var tmp = new x tmp.y = myproc tmp.y(5) # 未传a,自动取默认值1,执行myproc(1,5),输出1 tmp.y(10, 5) # 传入a=10覆盖默认值,执行myproc(10,5),输出10
通用偏函数模板(适合多场景复用)
如果有大量类似的参数绑定需求,可以写一个简单的通用模板,在赋值时直接绑定指定参数,不需要重复写匿名闭包:
template bindFirstArg(procInst: proc(a, b: int), boundA: int): proc(b: int) = let capturedA = boundA proc(b: int) = procInst(capturedA, b) type x = object y: proc(b: int) proc myproc(a,b:int) = echo a var tmp = new x # 赋值行直接绑定a=1 tmp.y = bindFirstArg(myproc, 1) tmp.y(5) # 执行myproc(1,5),输出1
Nim中过程的参数默认值、参数绑定逻辑都由调用方维护,不需要修改被调用的原过程实现,完全可以在赋值环节完成配置,满足“初始值不放在proc定义行”的要求。
内容的提问来源于stack exchange,提问作者Shoaib Mirzaei
相关产品推荐
相关产品推荐

