如何在AutoHotkey 1.1中实现IsCallable可调用性判断函数?
AutoHotkey 1.1.36.2 实现IsCallable函数方案
需求背景
需要实现一个名为IsCallable的函数,判断AutoHotkey变量中的内容是否可调用。可调用的内容包含三类:
- 字符串形式的已存在的普通函数名
- 通过
Func("函数名")获取的函数对象 - BoundFunc绑定函数对象
核心判定标准:该内容可以通过%fnobj%(...)的语法成功执行调用。
完整实现代码
test_check_callable() { fnstr := "fnhello" fnobjA := Func("fnhello") fnobjB := fnobjA.bind("0th") fnobjC := fnobjB %fnstr%() %fnobjA%("A1") %fnobjB%("B1") fnobjC.("C1", "C2") r1 := IsCallable(fnstr) ; 预期返回true r2 := IsCallable(fnobjA) ; 预期返回true r3 := IsCallable(fnobjB) ; 预期返回true r4 := IsCallable(fnobjC) ; 预期返回true e1 := IsCallable("NoSuch") ; 预期返回false e2 := IsCallable({key1:"value1"}) ; 预期返回false } fnhello(args*) { ; 可替换为自定义调试输出逻辑,这里用系统自带OutputDebug示例 OutputDebug, fnhello() parameters: %args.Length()% for i,arg in args { OutputDebug, param%i% = %arg% } } IsCallable(pobj) { ; 判断是否为字符串类型的有效函数名 if (IsString(pobj)) { return IsFunc(pobj) } ; 判断是否为Func或BoundFunc类型对象 else if (IsObject(pobj)) { return (pobj.base = Func || pobj.base = BoundFunc) } ; 其他类型均不可调用 return false }
实现逻辑说明
- 字符串类型判断:如果输入是字符串,直接用
IsFunc()验证该字符串对应的函数是否存在,存在则说明可通过%字符串%(...)调用。 - 对象类型判断:如果输入是对象,检查其基类是否为
Func或BoundFunc——这两类对象是AutoHotkey中支持%对象%(...)调用的核心可调用对象类型。 - 其他类型:既非字符串也非上述两类对象的内容,均判定为不可调用。
测试结果验证
运行test_check_callable()后,r1-r4会返回true,e1-e2返回false,完全符合预期。
内容的提问来源于stack exchange,提问作者Jimm Chen
相关产品推荐
相关产品推荐

