如何在一个块中检查多个变量的类型?

时间:2014-08-18 22:58:58

标签: autohotkey

如何在一个if语句块中检查多个变量的类型,而不使用多个if语句?例如:

If var1 is not integer
{
    MsgBox, 0, Error, var1 is not integer
    Return
}
If var2 is not integer
{
    MsgBox, 0, Error, var2 is not integer
    Return
}

我想要做的是检查单个布尔表达式中的类型。

我试过这个,但它不起作用。

if ((var1 is not integer) or (var2 is not integer))
{
    MsgBox, 0, Error, variables are not integers
    Return
}

1 个答案:

答案 0 :(得分:2)

AHK中的特殊If命令,如If var [not] betweenIf var [not] in/contains MatchList If var is [not] type IfWin...不是实际的布尔表达式,所以你不能使用布尔运算符链接它们 但是,这些条件语句可以包含在函数中。此外,If var is [not] type可以使用RegEx重建:

解决方案1:包装功能

isInteger(arg) {
    if arg is integer
        return true
    else
        return false
}

if(isInteger(123) && isInteger(456)) {
    MsgBox, yay!
}

解决方案2:RegEx

if(RegExMatch(123, "^\d+$") && RegExMatch(456, "^\d+$")) {
    msgbox, hooray!
}

一些测试

如果您有兴趣,请查看数组值,复制脚本并运行它。您可能会发现一些结果令人惊讶。我们的包装函数和RegExMatch都提供了相同的背靠背结果。

arr := [123, 456, 123.456, "789", "not_an_integer!", true, false]
msg := ""
Loop % arr.MaxIndex()
{
    msg .= arr[A_Index]
    msg .= ":`tisInteger(): " isInteger(arr[A_Index])
    msg .= " RegExMatch(): " RegExMatch(arr[A_Index], "^\d+$")
    msg .= "`n"
}
msgbox  % msg


isInteger(arg) {
    if arg is integer
        return true
    else
        return false
}