如何检查变量是否在AutoHotkey中分配了值?

How to check if a variable has been assigned a value in AutoHotkey?

提问人:Wenfang Du 提问时间:9/13/2021 最后编辑:Wenfang Du 更新时间:9/28/2021 访问量:1414

问:

#Warn

WinActivate ahk_class %PrevActiveClass%

运行上述代码时,解释器会抛出:

enter image description here

我想检查一下是否已经分配了一个值,如果有,那么运行,如何在AutoHotkey中实现这个逻辑?PrevActiveClassWinActivate

未定义的 自动热键 变量 值 赋值运算符

评论

1赞 Relax 9/13/2021
您收到此警告消息是因为您在代码中设置了 #Warn。在分配值之前,它会警告您正在使用变量 PrevActiveClass。为了避免这种情况,您可以在 auto-execute 部分中为该 var 分配一个空值:PrevActiveClass := ""
0赞 Wenfang Du 9/14/2021
@user3419297 谢谢,删除安全吗?我发现在这种情况下的警告是不必要的,因为代码更干净并且运行良好。是否为脚本启用?#Warn#Warn
1赞 Relax 9/14/2021
#Warn 可能很有用,因为它可以指示错误,例如拼写错误或缺少“全局”声明。

答:

0赞 Spyre 9/13/2021 #1

这是我通常用来检测空变量的方法

法典:

;#Warn

^r::
if(!PrevActiveClass){
    MsgBox not set yet
}
else{
    WinActivate ahk_class %PrevActiveClass%
}
return

^e::WinGetClass, PrevActiveClass, A ; Sets the variable to be the active window for testing

在 AHK 中,空变量被视为布尔值。因此,您可以在语句中检查它以确定它是否包含任何内容。此方法的一个警告(尽管它不适用于您的用例)是,如果您将布尔值分配给 var,它不会按预期工作。falseiffalse

评论

0赞 Wenfang Du 9/14/2021
如果你取消注释,它仍然会抛出。#Warn
1赞 0x464e 9/14/2021 #2

如果你真的想检查一个变量是否已经设置,你可以通过将它的地址(docs)与一个不存在的变量的地址进行比较来做到这一点:

var1 := ""      ;will return non-existent, this doesn't actually really create a variable
var2 := "hello" ;will return non-empty
var3 := "test"  ;now a variable actually gets created
var3 := ""      ;but here we set it to be empty, so it'll return empty
var4 := false   ;will return non-empty
;var5           ;will return non-existent


MsgBox, % (&Var1 = &NonExistentVar ? "Non-existent" : (Var1 = "" ? "Empty" : "Non-empty")) "`n"
        . (&Var2 = &NonExistentVar ? "Non-existent" : (Var2 = "" ? "Empty" : "Non-empty")) "`n"
        . (&Var3 = &NonExistentVar ? "Non-existent" : (Var3 = "" ? "Empty" : "Non-empty")) "`n"
        . (&Var4 = &NonExistentVar ? "Non-existent" : (Var4 = "" ? "Empty" : "Non-empty")) "`n"
        . (&Var5 = &NonExistentVar ? "Non-existent" : (Var5 = "" ? "Empty" : "Non-empty"))

但实际上,几乎总是(至少如果你设计好你的程序),你只需计算变量中的布尔值就可以了,如另一个答案所示。这样,您就可以轻松地在 if 语句中检查变量的存在if (var)

var1 := ""
var2 := "hello"
var3 := "0"
var4 := false
var5 := -1

MsgBox, % !!var1 "`n"
        . !!var2 "`n"
        . !!var3 "`n"
        . !!var4 "`n"
        . !!var5 "`n"

唯一需要注意的是,(和 0(false 是包含 0 的内置变量))和实际上不存在的变量之间没有区别。false""


AHKv2 为此实现了自己的内置函数:
https://lexikos.github.io/v2/docs/commands/IsSet.htm

0赞 Wenfang Du 9/14/2021 #3

引自 #Warn

启用或禁用可能指示错误的特定条件的警告,例如拼写错误或缺少“全局”声明。

#Warn [WarningType, WarningMode]

WarningType

要启用或禁用的警告类型。如果省略,则默认为 。All

UseUnsetLocal或 :在读取变量时发出警告,而之前未分配值或使用 VarSetCapacity() 初始化。如果该变量应为空,请分配一个空字符串以禁止显示此警告。UseUnsetGlobal

这分为局部变量和全局变量的单独警告类型,因为更常见的是,由于全局变量的持久性和脚本范围的性质,在没有事先初始化的情况下使用全局变量。出于这个原因,一些脚本作者可能希望为局部变量启用这种类型的警告,但对全局变量禁用它。[强调后加]

#Warn
; y := "" ; This would suppress the warning.
x := y ; y hasn't been assigned a value.

在这种情况下,可以安全地关闭以下警告:UseUnsetGlobal

#Warn
#Warn UseUnsetGlobal, Off

WinActivate ahk_class %PrevActiveClass%

评论

0赞 0x464e 9/15/2021
你也可以添加自己的答案,这很好,但我必须说,虽然这可能是你要找的,但这不是你问的问题的答案。您的答案是如何禁用特定警告的答案。您的问题是如何检查变量是否被分配了值。
0赞 Wenfang Du 9/16/2021
@0x464e 你的建议是有道理的,但是由于这个答案确实解决了我的问题,我认为这就是“接受”的意义所在,如果其他人发现这个答案不适合他们的需求,他们可以在此页面上寻找其他答案。