很多时候需要封装AHK函数,有一些函数的功能有关联,我们希望这些函数能够共用一个函数名,这个时就会用到”重载”的概念,但是AHK中没有提供”重载”功能(在Java这个概念经常接触得到,AHK和Python中却都没有),但是我们可以通过变通的方法实现重载。
什么是重载?
当存在多个”函数名相同的但是参数列表不同的函数”时构成重载。
比如Java中的println
public void println(String x) { synchronized (this) { print(x); newLine(); } } public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } }
可变参数
AHK中支持可变参数,在最后一个参数末尾加上*即可,可变参数中输入的数据会直接存入简单数组。利用这一特性,我们可以实现”参数列表长度不一”时的重载。
这个方法的优点在于简洁,缺点在于多个参数名无法区分,程序可读性会下降。
tf(params*) { mode:=params.Length() ;~ MsgBox,% mode if(mode=0) MsgBox,% "无参" else if(mode=1) MsgBox,% "一个参数" else if(mode=2) MsgBox,% "两个参数" else throw Exception("Param Error(Overload)") return }
在可选参数中使用特殊字符串
可以为参数列表中的”可选参数”设置特征默认值(尽量生僻),这些特征字符串出现的数量可以计算出”重载模式”。比起上一个的好处在于终于可以添加不同的参数名了。
其实本来想把默认值改为一个特殊对象,后来发现对象不能作为AHK函数的参数默认值。
tf(RenamePresetORptSource:="◇移动◇",ptTarget:="◇复制◇") { mode:=(RenamePresetORptSource!="◇移动◇")+(ptTarget!="◇复制◇") if(mode=0) MsgBox,% "移动(无参)" else if(mode=1) MsgBox,% "重命名(一个参数)" else if(mode=2) MsgBox,% "复制(两个参数)" else throw Exception("Param Error(Overload)") return }
本文来之心如止水
其实,怎么说呢!ahk是真的需要把这个感念引进来呢?