[AHK]連想配列、構造体、配列とEnumerator

連想配列

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

Forループ – AutoHotkey Wiki

 

コメント

PAGE TOP
Ads Block Detector Powered by codehelppro.com
Ads Blocker Detected!!!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました