You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
}

实现逻辑说明

  1. 字符串类型判断:如果输入是字符串,直接用IsFunc()验证该字符串对应的函数是否存在,存在则说明可通过%字符串%(...)调用。
  2. 对象类型判断:如果输入是对象,检查其基类是否为Func或BoundFunc——这两类对象是AutoHotkey中支持%对象%(...)调用的核心可调用对象类型。
  3. 其他类型:既非字符串也非上述两类对象的内容,均判定为不可调用。

测试结果验证

运行test_check_callable()后,r1-r4会返回true,e1-e2返回false,完全符合预期。

内容的提问来源于stack exchange,提问作者Jimm Chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:25:10