【風格】偽數(shù)組與關聯(lián)數(shù)組

作者:amnesiac 首發(fā):官方論壇中文版

偽數(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ù)組表示执俩。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市癌刽,隨后出現(xiàn)的幾起案子役首,更是在濱河造成了極大的恐慌,老刑警劉巖显拜,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衡奥,死亡現(xiàn)場離奇詭異,居然都是意外死亡远荠,警方通過查閱死者的電腦和手機矮固,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來譬淳,“玉大人档址,你說我怎么就攤上這事盹兢。” “怎么了守伸?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵绎秒,是天一觀的道長。 經(jīng)常有香客問我尼摹,道長替裆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任窘问,我火速辦了婚禮,結果婚禮上宜咒,老公的妹妹穿的比我還像新娘惠赫。我一直安慰自己,他們只是感情好故黑,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布儿咱。 她就那樣靜靜地躺著,像睡著了一般场晶。 火紅的嫁衣襯著肌膚如雪混埠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天诗轻,我揣著相機與錄音钳宪,去河邊找鬼。 笑死扳炬,一個胖子當著我的面吹牛吏颖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恨樟,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼半醉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了劝术?” 一聲冷哼從身側響起缩多,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎养晋,沒想到半個月后衬吆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡匙握,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年咆槽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圈纺。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡秦忿,死狀恐怖麦射,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灯谣,我是刑警寧澤潜秋,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站胎许,受9級特大地震影響峻呛,放射性物質發(fā)生泄漏。R本人自食惡果不足惜辜窑,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一钩述、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧穆碎,春花似錦牙勘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至色徘,卻和暖如春恭金,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褂策。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工横腿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辙培。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓蔑水,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扬蕊。 傳聞我的和親對象是個殘疾皇子搀别,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容