如何在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
相关产品推荐
相关产品推荐

