警告: 这是一个实验性函数. 它可能无法工作, 也可能含有 BUG 或可能会修改, 如以后删除时不会另行通知.

不要报告错误或请求此函数的新功能.

使用时请自行承担风险.

关 键 字 参 考


Static

定义静态变量或静态数组.

Static [作用域] 变量 [ = 初值 ]
Static [作用域] 数组[索引 1]...[索引 n] [ = 初值 ]

参 数

作用域 可选修饰符, 指定变量的作用范围: LocalGlobal.
变量 静态变量的名称.
初值 分配给变量的初始值. 可以是函数调用的数学或字符串运算. 此值仅在变量第一次声明时计算.
索引 数组维数的元素数量, 索引为 0 到 n-1.

备 注

关键字"Static"可以出现在可选参数"作用域"之前或以后, 例如: Local StaticStatic Local 都是允许的.

如果指定"作用域" 参数为 Local, 则静态变量仅在声明它的函数逻辑范围内有效. 即只有当符合声明条件的变量是可见的.
如果指定"作用域"参数为 Global, 则静态变量在脚本任何部分都有效, 此时的静态变量与脚本的全局变量的差别很小.
如果不使用"作用域", 则静态变量将被创建为局部范围; 此时的 Static 类似函数 Dim.

Local 与 Static 的不同之处是变量的生存期.
Local 只存储函数被调用时的信息, 并且只能作用于函数声明它的函数范围内;
当函数返回, 所有的局部变量被释放.
Static 的作用范围与 Local 相同, 但当函数结束执行后, 它们能继续存在, 且保留其最后一个值.
当寻找变量时, 首先检查局部范围, 然后是全局范围.

关键字 Static 的执行类似关键字 Global/Local/Dim.
  1. 都是先声明变量, 然后才能使用它.

  2. 都可以创建数组.


注意: 无论 AutoItSetOption("MustDeclareVars") 是否设置, 静态变量使用前, 必须使用关键字 Static 声明, 静态变量不能是 Const 常量.

可以在一行中声明多个静态变量:

Static $a, $b, $c


并初始化变量:

Static $a = 2, $b = 10, $c = 20



初始化静态变量, 初始值仅在创建时计算和分配, 在脚本随后的执行中, 所有的初始值将被忽略.

有关使用数组的信息参见 Local, 它具有与 Local 相同的功能, 以下情况除外:
  1. 重新初始化静态对变量没有效果.

  2. 更改静态数组的大小被视为 ReDim 操作.

  3. 不能修改局部静态变量为全局变量, 反之亦然.


如果要调整数组, 应使用 Redim.

相 关 函 数

Local, UBound, ReDim, AutoItSetOption

函 数 示 例


; 静态变量示例.

Func Test1()
    Static $STbFirstPass = 1

    If $STbFirstPass Then
        $STbFirstPass = 0
        ; 执行首次任务
    EndIf
    ; 函数应该做的其它事情
EndFunc   ;==>Test1

Func Accumulate($State)
    Static $Values[9]
    Local $I

    If IsNumber($State) Then
        Switch $State
            Case -1
                ; 复位
                For $I = 0 To 8
                    $Values[$I] = 0
                Next
                Return True
            Case -2
                Return $Values
            Case 0 To UBound($Values) - 1
                $Values[$State] += 1
                Return $Values[$State]
            Case Else
                If $State < 0 Then
                    SetError(1, 0)
                    Return False
                Else
                    Static $Values[$State + 1] ; 调整数组大小,以适应新值
                    $Values[$State] = 1
                    Return 1
                EndIf
        EndSwitch
    Else
        SetError(2, 0)
    EndIf
EndFunc   ;==>Accumulate

Global $I

Test1()

For $I = 1 To 99
    Accumulate(Random(0, 20, 1))
Next
For $I In Accumulate(-2)
    ConsoleWrite($I & ", ")
Next
ConsoleWrite("\n");

Test1()

provider with jb51.net (unicode)