Keyword Reference

首页  后退  前进

Dim / Global / Local / Const

定义变量,常量,或创建数组.

 

Global | Local [Const] 变量 [ = 初始值 ]

Global | Local [Const] 数组[下标 1]...[下标 n] [ = 初始值 ]

参数

Const

[可选] 如果定义, 将创建常量而不是变量.

变量

变量或常量的名称(以 $ 符号开头).

初始值

分配给变量的初始值. 常量必须包括初始值. 初始值可以是一个函数调用.

下标

数组维度的元素数量, 索引从 0 到 n-1.

备注

Dim/Local/Global 关键字执行类似功能:

1. 声明变量, 然后使用(类似 VBScript)

2. 创建数组

 

注意: 在 AutoIt 里面, 可以创建一个变量并赋值 ($myvar = 0), 但很多人喜欢明确的声明它们.

如果 AutoItSetOption("MustDeclareVars", 1) 被写入脚本, 则变量必须在使用前声明.

 

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

Local $vVar_1, $vVar_2, $vVar_3

 

并初始化变量:

Local $vVar_1 = 10, $vVar_2 = "20", $vVar_3 = 30

 

创建常量可以用类似的方法完成:

Const $CONST_1 = 1, $CONST_2 = 2, $CONST_3 = 3

Global Const $PI = 3.14, $MEANING_OF_LIFE = 42

Local Const $iApples = 500

 

常量一旦创建后, 则不能修改常量的值, 也不能修改现有的变量为常量.

 

要初始化数组, 在方括号内指定元素值, 并用逗号分隔. 如果有多个维数, 可以再套用方括号进行赋值.

分配值的元素数量可以少于(但不能超过)声明的元素数量. 函数调用也可以放置初始化数组.

如果调用的函数返回一个数组, 则数组元素将包含返回的数组.

Local $aArray_1[12] = [3, 7.5, "字符串"], $aArray_1[5] = [8, 4, 5, 9, 1]

Local $aGrid[2][4] = [["保罗", "吉姆", "理查德", "路易斯"], [485.44, 160.68, 275.16, 320.00]]

Global $aTest[5] = [3, 1, StringSplit("亚伯|杰克|博比|马蒂", "|"), Cos(0)]

 

 

Dim, Local 与 Global 三者的不同之处在于其声明变量的作用域:

Dim = 如果同名的全局变量不存在, 则作用域为局部 (此时会作为全局变量重复使用!)

Global = 强制创建的变量为全局作用域

Local = 强制创建的变量为局部作用域

 

应该更多的使用 Local 或 Global, 而不是 Dim, 使变量/常数/数组的作用域为理想的范围.

 

使用变量首先检查其局部作用域, 然后再检查其全局作用域.

 

创建数组时, 数组最大只能达 64 维, 和/或 1600 万个元素.

 

AutoIt 的一个独特的功能是能够复制这样的数组:

$mycopy = $myarray

$mycopy 将成为数组 $myarray 的精确副本, 并具有相同的尺寸, 不需要通过 Dim 语句声明它.

如果设置了 AutoItSetOption ( "MustDeclareVars", 1) 则变量 $mycopy 仍需首先声明, 但可以不指定大小.

如果变量 $mycopy 本身已经是数组或已被赋值, 则将删除原内容后再执行复制动作.

 

要删除数组(例如一个庞大全局数组, 需要释放其占用的内存), 只分配给它一个 0 值:

$aArray = 0

这将释放数组, 并将其转换为值 0.

 

再次声明相同的(数组)变量名, 将删除所有数组值, 并重置大小为新的定义.

在同一作用域内以一个简单的值声明一个变量, 不会修改(同名)变量的(先前)值.

 

如果声明一个与参数同名的变量, 当函数内部使用 Local 用户函数时将出现错误.

Global 在函数内部可用于分配全局变量, 但是如果全局变量与本地变量(或参数)同名,

则只能作为局部变量使用. 建议本地和全局变量使用不同的名称.

 

相关

AutoItSetOption, UBound, ReDim, Static

函数示例

示例 1

; Example 1 - Declaring variables
Local $i, $j = 23, $k
Global $g_fPI = 3.14159, $g_iRADIUS
Local $iDaysWorking = 5
; Example 2 - Declaring arrays
Global $g_aChessBoard[8][8]
Local $aStates[2], $aWindowsStats[4]
; Example 3 - Declaring constant variables
Const $iX1 = 11, $iY1 = 23, $iZ1 = 55
Global Const $PI = 3.14159, $E = 2.71828
Local Const $DAYS_WORKING = 5

示例 2

#AutoIt3Wrapper_Au3Check_Parameters=---w- 3 -w- 6 ; Already declared var=off, warn when using Dim=off
#include <MsgBoxConstants.au3>
Dim $vVariableThatIsGlobal = "This is a variable that has ""Program Scope"" aka Global."
MsgBox($MB_SYSTEMMODAL, "", "An example of why Dim can cause more problems than solve them.")
Example()
Func Example()
    ; That looks alright to me as it displays the following text: This is a variable that has "Program Scope" aka Global.
    MsgBox($MB_SYSTEMMODAL, "", $vVariableThatIsGlobal)
    ; Call some random function.
    Local $vReturn = SomeFunc()
    ; The Global variable ($vVariableThatIsGlobal) changed because I totally forgot I had a duplicate variable name in "SomeFunc".
    MsgBox($MB_SYSTEMMODAL, $vReturn, "The variable has now changed: " & $vVariableThatIsGlobal)
EndFunc   ;==>Example
Func SomeFunc()
    ; This should create a variable in Local scope if the variable name doesn't already exist.
    ; For argument sake I totally forgot that I declared a variable already with the same name.
    ; Well I only want this to be changed in the function and not the variable at the top of the script.
    ; Should be OK right? Think again.
    Dim $vVariableThatIsGlobal = ""
    For $i = 1 To 10
        $vVariableThatIsGlobal &= $i ; This will return 12345678910 totally wiping the previous contents of $vVariableThatIsGlobal.
    Next
    Return $vVariableThatIsGlobal
EndFunc   ;==>SomeFunc

----------------------------------------