「河许人」AutohotkeyAHK程序设计AutoHotKey

[基础] 在AHK中实现函数重载的效果

2018-11-14  本文已影响5人  d61f25068828

很多时候需要封装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函数的参数默认值。

11月09日-有人问"为什么不用空字串",因为很多时候空字串也是有意义的,这个特殊值要越没有意义,越不可能用到越好。如果你的场景下保证"空字串"有特殊性,那么可以用,很简洁很好。

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
}

心如止水是Java/AHK的持续学习者
欢迎您来和我探讨Java/AHK问题 QQ2531574300 ^_^


作者:心如止水
上一篇 下一篇

猜你喜欢

热点阅读