提问人:Wenfang Du 提问时间:9/13/2021 最后编辑:Wenfang Du 更新时间:9/28/2021 访问量:1414
如何检查变量是否在AutoHotkey中分配了值?
How to check if a variable has been assigned a value in AutoHotkey?
问:
#Warn
WinActivate ahk_class %PrevActiveClass%
运行上述代码时,解释器会抛出:
我想检查一下是否已经分配了一个值,如果有,那么运行,如何在AutoHotkey中实现这个逻辑?PrevActiveClass
WinActivate
答:
这是我通常用来检测空变量的方法
法典:
;#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,它不会按预期工作。false
if
false
评论
#Warn
如果你真的想检查一个变量是否已经设置,你可以通过将它的地址(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
引自 #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%
评论
PrevActiveClass := ""
#Warn
#Warn