IsSet / IsSetRef

如果指定变量已经被赋值, 则返回一个非零数字.

Boolean := IsSet(Var)
Boolean := IsSetRef(&Ref)

参数

Var

类型: 变量

一个直接变量引用. 例如: IsSet(MyVar).

&Ref

类型: VarRef

对变量的间接引用. 通常不会像在 IsSetRef(&MyVar) 中那样直接传递, 而是间接传递, 比如在解引用一个 包含 VarRef 的参数之前检查它.

返回值

类型: 整数(布尔值)

如果 Var 或由 Ref 表示的变量已经被赋值, 则函数返回 1(true), 否则为 0(false).

备注

使用 IsSet 来直接检查一个变量, 如 IsSet(MyGlobalVar).

使用 IsSetRef 来检查一个 VarRef, 它通常被一个变量所包含, 如下面的示例所示.

未赋值的变量也称为未初始化变量. 默认情况下, 试图读取一个未初始化的变量会导致异常抛出. IsSet 可以用来避免这种情况, 例如在第一次使用全局变量或静态变量时是否需要初始化.

注意: 静态初始化static my_static_array := [] 只被计算一次, 即在执行过程中第一次到达时, 因此通常不需要使用 IsSet.

尽管 IsSet 使用了与函数调用相同的语法, 但它可以被认为是一个操作符而不是一个函数. 关键字 IsSet 保留用于此处所示的用法, 不能被重新定义为一个变量或函数. IsSet 不能被间接调用, 因为任何试图传递一个未初始化的变量的行为都会导致错误的产生.

IsSetRef 也可以用来检查一个特定的变量, 通过与引用操作符一起使用. 当以这种方式使用它时, 要注意如果是全局变量需要先声明该变量. 例如, 如果在一个没有声明 global MyVar 的假设-局部函数中使用的话, IsSetRef(&MyVar) 中的 & 会导致 MyVar 默认解析为一个局部变量.

ByRef 参数

示例

显示 IsSet 和 IsSetRef 的不同用法.

Loop 2
    if !IsSet(MyVar)  ; 是否是第一次 "使用" MyVar?
        MyVar := A_Index  ; 第一次 "使用" 时进行初始化.
MsgBox Function1(&MyVar)
MsgBox Function2(&MyVar)

Function1(&Param)  ; ByRef 参数.
{
    if IsSet(Param)  ; 传递 Param 本身, 它是 MyVar 的别名.
        return Param  ; ByRef 参数会自动解引用.
    else
        return "unset"
}
Function2(Param)
{
    if IsSetRef(Param)  ; 传递包含 VarRef 的 Param.
        return %Param%  ; 显式解引用 Param.
    else
        return "unset"
}