偽數(shù)組應該是 AutoHotkey 中特有的概念诵闭,下面的內(nèi)容需要稍有了解呕乎,其中部分內(nèi)容來自幫助昔汉,稍做了調整让网。
偽數(shù)組
偽數(shù)組的含義
偽數(shù)組是概念上的:每個偽數(shù)組實際上只是一系列連續(xù)編號的變量或函數(shù)的集合,它們的每一個被視為偽數(shù)組的“元素”辞友。AutoHotkey 內(nèi)部不會以任何方式把這些元素鏈接在一起栅哀。
任何接受 OutputVar 或能賦值的命令都可以用來創(chuàng)建偽數(shù)組。最簡單的例子是使用賦值運算符(:=)称龙,如下所示:
Array%j% := A_LoopField
通過在索引間使用自選分隔符可以創(chuàng)建多維偽數(shù)組留拾,例如:
Array%j%_%k% := A_LoopReadLine
操作偽數(shù)組
下面的例子演示了如何創(chuàng)建和訪問偽數(shù)組,這里是從文本文件獲取一系列的名稱:
; 寫入數(shù)據(jù)到偽數(shù)組:
ArrayCount := 0
Loop, Read, C:\Test.txt ; 循環(huán)獲取文件中的每行鲫尊,一次一行痴柔。
{
ArrayCount += 1 ; 記錄偽數(shù)組中的項目數(shù),這里不記錄后面獲取不方便疫向。
Array%ArrayCount% := A_LoopReadLine ; 把此行保存到偽數(shù)組中的下一個元素竞帽。
}
; 從偽數(shù)組中讀瓤甘:
Loop, %ArrayCount%
{
; 下一行使用 := 運算符獲取偽數(shù)組元素:
element := Array%A_Index% ; A_Index 是內(nèi)置變量。
MsgBox, % "索引號" . A_Index . "的元素的值為" . Array%A_Index%
}
看過這兩個例子后屹篓,里面的操作中我們只是連續(xù)的操作變量罷了,與操作普通變量在性質上沒有區(qū)別匙奴。唯一的區(qū)別是名稱堆巧,這系列變量的名稱一般后面部分為數(shù)字,比較典型的如 StringSplit泼菌、WinGet List 及 RegExMatch 這些命令創(chuàng)建的偽數(shù)組谍肤。還有些命令雖然會創(chuàng)建一系列變量,變量的名稱卻不是以數(shù)字結尾哗伯,如 GuiControlGet Pos荒揣、SysGet 等。
在幫助(v1.1.14.04)中搜索“偽數(shù)組”即可找到創(chuàng)建偽數(shù)組的所有方法焊刹。
關聯(lián)數(shù)組
關聯(lián)數(shù)組類似于其他語言中的數(shù)組系任,這是一種數(shù)據(jù)結構,本質上是一種特殊的對象虐块。
操作關聯(lián)數(shù)組
自包含關聯(lián)數(shù)組可以使用 Object() 創(chuàng)建. 例如:
; 創(chuàng)建數(shù)組后俩滥,初始為空:
Array := Object()
; 寫入數(shù)據(jù)到數(shù)組:
Loop, Read, C:\Guest List.txt ; 依次獲取文件中的每行文本。
{
Array.Insert(A_LoopReadLine) ; 添加到數(shù)組中贺奠。
}
; 從數(shù)組中讀取數(shù)據(jù)霜旧,在一般情況下建議使用這種方式(即 for 循環(huán)):
for index, element in Array
{
MsgBox, % "索引號為" . index . "的元素的值為" . element
}
這個例子僅演示了對象提供的功能中很小的一部分,還可以可以設置儡率、獲取挂据、插入、移除和枚舉項目儿普。除了數(shù)字崎逃,還可以把字符串和對象作為鍵使用。對象可以作為值存儲到其他對象中并且可以作為函數(shù)參數(shù)或返回值傳遞箕肃。對象還可以用新功能進行擴展婚脱。
For 循環(huán)與 Loop 循環(huán)
對于這樣特殊的關聯(lián)數(shù)組,還可以把上面的 For 循環(huán)替換為 Loop 循環(huán):
; 使用傳統(tǒng)方式
Loop, % Array.MaxIndex()
{
; 使用“Loop”勺像,索引必須是連續(xù)的數(shù)字障贸,從 1 到數(shù)組中元素的個數(shù)(或者必須在循環(huán)中進行計算)。
MsgBox, % "索引號為" . A_Index . "的元素的值為" . Array[A_Index]
}
實際上不建議使用 Loop 對關聯(lián)數(shù)組進行循環(huán)操作(很蹩腳)吟宦,上面的例子中數(shù)組的索引從 1 開始且是連續(xù)的整數(shù)篮洁,所以可以使用 Loop 循環(huán)。然而殃姓,關聯(lián)數(shù)組中的鍵可以為字符串袁波、整數(shù)或對象瓦阐,即使鍵為整數(shù)時還可能是稀疏分布的,例如 {1:"a",1000:"b"}篷牌,在這些一般情況下都無法使用 Loop 代替睡蟋。
關聯(lián)數(shù)組與偽數(shù)組的比較
盡管 Insert() 和枚舉數(shù)有它們的用途, 不過一些用戶可能會發(fā)現(xiàn)使用它們比用更傳統(tǒng)的方式容易些。下面的例子中把偽數(shù)組和關聯(lián)數(shù)組的操作方式進行比較枷颊,其中注釋中的為偽數(shù)組的操作方式:
; 與變量可直接使用不同戳杀,數(shù)組在使用前必須初始化:
Array := Object()
; Array%j% := A_LoopField
Array[j] := A_LoopField
; Array%j%_%k% := A_LoopReadLine
Array[j, k] := A_LoopReadLine
ArrayCount := 0
Loop, Read, C:\Guest List.txt
{
ArrayCount += 1
; Array%ArrayCount% := A_LoopReadLine
Array[ArrayCount] := A_LoopReadLine
}
Loop, %ArrayCount%
{
; element := Array%A_Index%
element := Array[A_Index]
; MsgBox % "Element number " . A_Index . " is " . Array%A_Index%
MsgBox, % "Element number " . A_Index . " is " . Array[A_Index]
}
這個是幫助中的例子,但實際意義不大夭苗,因為它是以偽數(shù)組的方式在偽數(shù)組的功能上進行的比較信卡。例如使用 ArrayCount 變量保存數(shù)組元素個數(shù),我們知道這對于關聯(lián)數(shù)組是多余的题造,它的元素個數(shù)是由程序維護傍菇,可以直接使用 MaxIndex() 方法獲取,而且獲取值時無需通過元素個數(shù)界赔,可直接 for 循環(huán)丢习。
幫助中提到這個比較會“讓大家更容易從原來使用偽數(shù)組的習慣中過渡過來”,不過我個人認為這樣做是否像用漢字標出英語單詞的發(fā)音來學英語呢仔蝌?
小結
目前而言泛领,在支持創(chuàng)建偽數(shù)組的命令中還是需要偽數(shù)組(偽數(shù)組存在的必要性),在其他地方關聯(lián)數(shù)組具有優(yōu)勢(關聯(lián)數(shù)組的功能強大敛惊、使用方便)渊鞋,即關聯(lián)數(shù)組尚無法完全取代偽數(shù)組(即使作為中間產(chǎn)物),盡管我推薦在一般情況下使用關聯(lián)數(shù)組瞧挤。
至于 AutoHotkey v2 中將如何锡宋,我們且拭目以待。以后提到“數(shù)組”時都指關聯(lián)數(shù)組特恬,對于“偽數(shù)組”會直接以偽數(shù)組表示执俩。