警告: この機能は実験的なものです。動作しない、バグがある可能性があります。また予告なしに変更、削除される可能性があります。

この機能についてバグ報告、要望を出さないでください。

自己の責任のもとに使用してください。

Keyword Reference

Static

静的変数の宣言、または静的配列の作成を行います。

Static [Scope] $variable [ = initializer ]
Static [Scope] $array[subscript 1]...[subscript n] [ = initializer ]

 

パラメータ

Scope オプションの修飾句。LocalまたはGlobalで変数のスコープを指定します。
$variable 宣言する静的変数の名前
initializer 変数の初期代入値。initializerには数式、文字列操作を含む関数呼び出しを指定できます。 このinitializerはこの変数の最初の宣言時にのみ評価されます。
subscript 配列の各次元に作成する要素数。0からn-1でインデックスされる。

 

注意

Static句はオプションのスコープ指定句の前、または後に書くことができます。例えばLocal StaticStatic Localはどちらも問題なく動作します。

スコープ修飾句にLocalが使用された場合、静的変数は宣言された関数の中でだけ参照、代入ができるようになります。スコープ修飾句にGlobalが使用された場合、静的変数はスクリプトのどこからでも参照、代入ができるようになります。この点でGlobal StaticとGlobal変数の間には大きな違いはありません。スコープ修飾句が使用されなかった場合、静的変数はローカルスコープで作成されます。この場合、StaticはDimと同じ意味を持ちます。

LocalとStaticの違いは変数の寿命です。Local変数は関数呼び出しの間だけ保持され、宣言された関数の中でだけ使用することができます。関数が返ると全てのローカル変数は解放されます。Static変数も同様に宣言された関数の中でだけ使用できますが、関数の実行が終わった後も最後に代入された値を保持したまま存在し続けます。変数を探す際にはローカルスコープがまず調べられ、次にグローバルスコープが調べられます。

Static句はGlobal/Local/Dim句と同じ機能を持っています。
  1. これらは全て使用前に変数を宣言します。

  2. これらは全て配列を作成することができます。


注意: AutoItSetOption("MustDeclareVars")が設定されているかどうかによらず、Static変数は使用前に必ずStatic句を使用して宣言されている必要があります。Static変数をConstにすることはできません。

1行で複数の静的変数を宣言することもできます:

Static $a, $b, $c


また変数の初期化も可能です:

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



静的変数を初期化する場合、初期値は変数が作成されてから一度だけ代入、評価されます。移行の処理での初期化は無視されます。

配列に対して使用する場合の詳細についてはLocalを参照してください。以下の点を除いてはLocalと同じ機能を持っています:
  1. Static変数の再初期化は機能しません。

  2. Static配列のサイズ変更はReDimと同じように行います。

  3. 静的変数をローカル変数またはグローバル変数に変更することはできません。逆も同様です。


配列のサイズを変更したい場合はStaticを使用して行い、ReDimを使用しないでください。

 

関連

Local, UBound, ReDim, AutoItSetOption

 

Example


; Static変数の例

Opt("MustDeclareVars", 1)

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()