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

如何在AHK函数中获取用户显式传入的参数?(类比PowerShell $PsBoundParameters)

在AutoHotkey中获取用户显式传入的函数参数

你习惯在PowerShell里用$PsBoundParameters获取用户显式传入的参数(排除使用默认值的参数),现在在AHK中定义了如下函数:

MyCar(Color, TyreCount, SeatCount, Plate := 1975){}

当以MyCar("Red",, 4)调用时,可以通过以下几种方式在函数内部拿到实际传入的参数:

方法一:逐个参数判断(适配AHK v1/v2)

AHK没有直接的内置对象,但可以通过判断参数是否被显式赋值来筛选:

AHK v2版本

MyCar(Color, TyreCount, SeatCount, Plate := 1975){
    ; 存储显式传入参数的对象
    boundParams := {}
    
    ; 无默认值的参数,只要调用就一定是显式传入
    boundParams["Color"] := Color
    
    ; 判断TyreCount是否被显式赋值(哪怕传的是空值)
    if IsSet(TyreCount) {
        boundParams["TyreCount"] := TyreCount
    }
    
    ; SeatCount是显式传入的,直接加入
    boundParams["SeatCount"] := SeatCount
    
    ; Plate有默认值,判断是否被显式传入且值不等于默认值
    if IsSet(Plate) && Plate != 1975 {
        boundParams["Plate"] := Plate
    }
    
    ; 示例:输出所有显式传入的参数
    for key, value in boundParams {
        MsgBox key ": " value
    }
}

AHK v1版本

v1没有IsSet(),可以用VarSetCapacity()判断变量是否被赋值:

MyCar(Color, TyreCount, SeatCount, Plate := 1975){
    boundParams := {}
    boundParams["Color"] := Color
    
    if (VarSetCapacity(TyreCount) != 0) {
        boundParams["TyreCount"] := TyreCount
    }
    
    boundParams["SeatCount"] := SeatCount
    
    if (VarSetCapacity(Plate) != 0 && Plate != 1975) {
        boundParams["Plate"] := Plate
    }
    
    for key, value in boundParams {
        MsgBox % key ": " value
    }
}

方法二:利用函数参数元数据(仅AHK v2)

v2中可以通过Func(A_ThisFunc).Params获取函数的参数列表,动态遍历判断,适合参数较多的函数:

MyCar(Color, TyreCount, SeatCount, Plate := 1975){
    boundParams := {}
    
    ; 遍历函数的所有参数信息
    for param in Func(A_ThisFunc).Params {
        paramName := param.Name
        paramValue := %paramName%
        
        ; 先判断参数是否被显式赋值
        if IsSet(paramValue) {
            ; 如果参数有默认值,再判断传入值是否不等于默认值
            if param.HasDefault {
                defaultValue := param.Default.Value
                if paramValue != defaultValue {
                    boundParams[paramName] := paramValue
                }
            } else {
                ; 无默认值的参数,直接加入
                boundParams[paramName] := paramValue
            }
        }
    }
    
    ; 示例:输出结果
    for k, v in boundParams {
        MsgBox k ": " v
    }
}

调用MyCar("Red",, 4)时,上述方法都会得到包含Color: Red、TyreCount: ""、SeatCount: 4的参数集合(TyreCount是显式传的空值,所以会被包含)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:43:23