</head> <body> <h1>IsSet / IsSetRef</h1> <p>如果指定变量已经被赋值, 则返回一个非零数字.</p> <pre class="Syntax">Boolean := <span class="func">IsSet</span>(Var) Boolean := <span class="func">IsSetRef</span>(&amp;Ref)</pre> <h2 id="Parameters">参数</h2> <dl> <dt>Var</dt> <dd> <p>类型: <a href="../Concepts.htm#variables">变量</a></p> <p>一个直接变量引用. 例如: <code>IsSet(MyVar)</code>.</p> </dd> <dt>&amp;Ref</dt> <dd> <p>类型: <a href="../Concepts.htm#variable-references">VarRef</a></p> <p>对变量的间接引用. 通常不会像在 <code>IsSetRef(&amp;MyVar)</code> 中那样直接传递, 而是间接传递, 比如在<a href="../Variables.htm#deref">解引用</a>一个 <em>包含</em> VarRef 的参数之前检查它.</p> </dd> </dl> <h2 id="Return_Value">返回值</h2> <p>类型: <a href="../Concepts.htm#boolean">整数(布尔值)</a></p> <p>如果 <em>Var</em> 或由 <em>Ref</em> 表示的变量已经被赋值, 则函数返回 1(true), 否则为 0(false).</p> <h2 id="Remarks">备注</h2> <p>使用 IsSet 来直接检查一个变量, 如 <code>IsSet(MyGlobalVar)</code>.</p> <p>使用 IsSetRef 来检查一个 <a href="../Concepts.htm#variable-references">VarRef</a>, 它通常被一个变量所包含, 如下面的示例所示.</p> <p>未赋值的变量也称为<a href="../Concepts.htm#uninitialized-variables">未初始化变量</a>. 默认情况下, 试图读取一个未初始化的变量会导致异常抛出. IsSet 可以用来避免这种情况, 例如在第一次使用全局变量或静态变量时是否需要初始化.</p> <p class="note"><strong>注意:</strong> <a href="../Functions.htm#InitStatic">静态初始化</a> 如 <code>static my_static_array := []</code> 只被计算一次, 即在执行过程中第一次到达时, 因此通常不需要使用 IsSet.</p> <p>尽管 IsSet 使用了与函数调用相同的语法, 但它可以被认为是一个操作符而不是一个函数. 关键字 <em>IsSet</em> 保留用于此处所示的用法, 不能被重新定义为一个变量或函数. IsSet 不能被间接调用, 因为任何试图传递一个未初始化的变量的行为都会导致错误的产生.</p> <p>IsSetRef 也可以用来检查一个特定的变量, 通过与<a href="../Variables.htm#ref">引用操作符</a>一起使用. 当以这种方式使用它时, 要注意如果是全局变量需要先<a href="../Functions.htm#Global">声明该变量</a>. 例如, 如果在一个没有声明 <code>global MyVar</code> 的假设-局部函数中使用的话, <code>IsSetRef(&amp;MyVar)</code> 中的 <code>&amp;</code> 会导致 <em>MyVar</em> 默认解析为一个局部变量.</p> <h2 id="Related">相关</h2> <p><a href="../Functions.htm#ByRef">ByRef 参数</a></p> <h2 id="Examples">示例</h2> <div class="ex" id="ExBasic"> <p><a class="ex_number" href="#ExBasic"></a> 显示 IsSet 和 IsSetRef 的不同用法.</p> <pre> Loop 2 if !IsSet(MyVar) <em>; 是否是第一次 "使用" MyVar?</em> MyVar := A_Index <em>; 第一次 "使用" 时进行初始化.</em> MsgBox Function1(&amp;MyVar) MsgBox Function2(&amp;MyVar) Function1(&amp;Param) <em>; ByRef 参数.</em> { if IsSet(Param) <em>; 传递 Param 本身, 它是 MyVar 的别名.</em> return Param <em>; ByRef 参数会自动解引用.</em> else return "unset" } Function2(Param) { if IsSetRef(Param) <em>; 传递包含 VarRef 的 Param.</em> return %Param% <em>; 显式解引用 Param.</em> else return "unset" }</pre> </div> </body> </html>