連想配列
AutoHotkeyでも連想配列が使えるようだったので試してみた。
^+a:: test:= Object() test["bb"]:="bbb" msgbox, % test["bb"] return ^+b:: test:={"a": "abc", "b": "def"} msgbox, % test["a"] ", " test["b"] return ^+c:: test:=Object("a", "ca", "b", "cb") msgbox, % test["a"] ", " test["b"] return
ちょっと感動するレベルで簡単に使えてびっくりw
注意点は、test[“bb”]:=”bbb” のように代入する場合、最初にObjectを作成しておかないといけないことぐらい。
AHKマジスゲー
2021/08/15, 追記
構造体
もしかして、Object型は構造体としても使えるのか?と思い適当に下記のように書いてみた。
^+a:: test:= Object() test.str:="何か" test.val:=11 msgbox, % test.str ", " test.val return
サクッと使えたw
2022/09/02追記, AurtoHotkey version: 1.1.34.04
たまに忘れるから、他の類似してるオブジェクトも整理しとく。
配列
配列と言っても、連想配列を配列として使う形みたい。(挙動は連想配列とシームレスだけど、Arrayだと処理が高速だったりするんだろうか?)
^+a:: tmpArr:=[5,12,"あいう",34] msgbox,% "" tmpArr[1] ", " tmpArr[2] ", " tmpArr[3] ", " tmpArr[4] return ^+b:: tmpArr:=[5,12,"あいう",34] tmpArr["abc"]:="testabc" msgbox,% "" tmpArr[2] ", " tmpArr["abc"] return
上のテストコードでいうと、「tmpArr:=[5,12,”あいう”,34]」のように数値、文字列混在で配列を作れる。配列の開始数字は1から。
また、^+bのショートカットのように配列を作った後、連想配列として代入を行うことも出来た。
この辺とか見ると、
Array := [Item1, Item2, ..., ItemN] Array := Array(Item1, Item2, ..., ItemN)
Array := {KeyA: ValueA, KeyB: ValueB, ..., KeyZ: ValueZ} Array := Object("KeyA", ValueA, "KeyB", ValueB, ..., "KeyZ", ValueZ)
という感じで、記載されている。見た目的には、「[]」か「Array()」で定義すると、連想配列のキーが、連番で割り当て。「{}」か「Object()」で定義すると、連想配列のキーも個別に設定できるということのよう。
連番関係の関数注意点
^+a:: test:= Object() test[-1]:="valmn1" test[0]:="val0" test[1]:="val1" test[2]:="val2" test[12]:="val12" test["ABCD"]:="valABCD" msgbox, % "test[-1]: " test[-1] ", test[0]: " test[0] "`ntest[1]: " test[1] ", test[2]: " test[2] ", test[3]: " test[3] "`nlength: " test.length() ", count: " test.count() "`nMinIndex: " test.MinIndex() "`nMaxIndex: " test.MaxIndex() return
上のコードを実行すると、
test[-1]: valmn1, test[0]: val0
test[1]: val1, test[2]: val2, test[3]:
length: 12, count: 6
MinIndex: -1
MaxIndex: 12
と返ってくる。
lengthは設定した配列の最も大きい数値、countは要素数という点に注意。また、歯抜けのtest[3]は呼び出しても何も返ってこない。
配列番号は負の値も設定可能。最小値はMinIndex関数で取れる。MaxIndexはlengthと同じ。
因みに、オブジェクトの全ての要素を出したいときは、for inで出せる。他の言語のforeachと同じ感じ。
^+a:: test:= Object() test[1]:="val1" test[2]:="val2" test[7]:="val7" test["ABCD"]:="valABCD" ret:="" for, key, val in test { ret:=ret key ":" val ", " } msgbox, % ret return ;実行結果: 1:val1, 2:val2, 7:val7, ABCD:valABCD,
Enumeratorは、基本使わない。
AHKは下記のようにEnumeratorで要素を引っ張ることも出来る。
ただ、使い勝手的に、for inで書く方が楽だと思う。
^+a:: test:= Object() test[1]:="val1" test[2]:="val2" test[7]:="val4" test["ABCD"]:="valABCD" ret:="enum`n" objenum := test._NewEnum() While objenum[key, val] { ret.=key ":" val ", " } msgbox, % ret return ^+b:: test:= Object() test[1]:="val1" test[2]:="val2" test[7]:="val4" test["ABCD"]:="valABCD" ret:="enum`n" objenum := test._NewEnum() While objenum.Next(key, val) { ret.=key ":" val ", " } msgbox, % ret return
参考
Objectオブジェクト – AutoHotkey Wiki
Enumeratorオブジェクト – AutoHotkey Wiki
コメント