Objectオブジェクト

提供: AutoHotkey Wiki
移動: 案内検索

Object() または {} で作成されたオブジェクトが持つ全ての組み込みメソッドは、組み込み関数やメソッドを介して扱うことができる。

result := obj.Method(params)

このやり方でメソッドを呼び出すことで、あらゆるオブジェクトのメソッドを独自に実装することが可能となる。 オブジェクトの組み込みメソッドをオーバーライドした場合で、元来の機能を呼び出すときは以下のようにする:

result := ObjMethod(obj, params)

スクリプトのロード時に名前を解決してしまうので組み込み関数を使うほうが僅かに速いが、直感的な文法とは言い難い。 オブジェクトに実装されたいかなる独自機能も無視されてしまうので、この組み込み関数はオブジェクト内部でのみ使うべきだだろう。

(重要) L53より、以下のメソッド群は _ 接頭辞が無くても動作するようになった。

例) obj._MaxIndex()obj.MaxIndex()

ただし、従来通りの _ 接頭辞が付いたものも今のところ有効である。


Insert メソッド[編集]

キーと値の組をオブジェクトに格納する。

Object.Insert(Index, Value1 [, Value2, ... ValueN ])    ; (1)
Object.Insert(Value)                                    ; (2)
Object.Insert(Key, Value)                               ; (3)
Index (1) Value1 の挿入される整数キーを指定する。任意の Value2 以降の引数はそれぞれ、Index+1, Index+2 ... Index+N-1 に格納される。
(2) Index を省略した場合は、整数インデックスの最大値+1(MaxIndex()="" ? 1 : _MaxIndex()+1)Value が格納される。

Index~Object._MaxIndex()間にある既存キーは一つずらされて、その位置に新しい値が挿入される。 ※1

Key (3) 文字列やオブジェクトをキーにできる。既存のキーを指定した場合、値は上書きされる。
Value[1...N] 文字列や数値、オブジェクト。
戻り値
成功時は1を返す。メモリ不足で失敗した場合は空白文字列を返す。

注意) このメソッドは __Setメカニズムおよびbaseキーの特殊な振る舞いをバイパスする。 例えば Object._Insert("base","") としたとき、Object.base は実際のベースオブジェクトではなく空文字列を返すようになるが、オブジェクトに定義したメタ関数の挙動を妨げることにはならない。

Remove メソッド[編集]

オブジェクトからキーと値の組を取り除く

Object.Remove(FirstKey, LastKey)
FirstKey,
LastKey
削除したいキーの範囲を整数および文字列で指定する。
双方が整数の場合、LastKeyよりも大きな既存キーは(LastKey - FirstKey + 1) だけ詰められて、整数キーの各要素がキーの昇順に並ぶようにする。※1 双方とも同型(整数または文字列)でなければならない。

[L61+] FirstKey に整数値、LastKey に空文字列("")を指定した場合、FirstKey の項目は削除されるが、FirstKeyより大きなキーの配列番号はデクリメントされない。

戻り値
削除に成功した数を返す。0の場合は該当するキーが無し。空文字列の場合は操作失敗。
Object.Remove(Key = MaxIndex())
Key 任意のキー。省略時は整数キーのうち最大値が指定されたとみなす。整数キーが無い場合は何も削除されない。
削除後に残るキーは Remove(Key,Key) を利用して再調整される。
戻り値
削除されたキーに紐付く値を返す。対象となるキーがない場合は空文字列を返す。

MinIndex / MaxIndex メソッド[編集]

MinIndex := Object.MinIndex()
MaxIndex := Object.MaxIndex()

任意の整数キーが存在する場合、MinIndexはその最小値を、MaxIndexはその最大値を返す。 それ以外の場合は空文字列を返す。

SetCapacity メソッド[編集]

オブジェクトに格納可能なフィールドの容量、または該当キーのフィールドに割り当てるメモリ容量、を設定する。

Object.SetCapacity(MaxItems)
Object.SetCapacity(Key, ByteSize)
MaxItems オブジェクトに格納可能なキーと値の容量を整数で指定する(容量を超えた場合は自動で拡張される)。
現在格納されている数より少ない値が指定された場合は現在の格納数に切り詰められる。
Key 任意のキー。
ByteSize 文字列(メモリ)バッファとして利用可能なサイズを指定する(サイズにNULL終端は含めない)。
該当フィールドがない場合は新規作成される。0を指定した場合はバッファは削除されるが、該当キーのフィールドは残る。
ByteSize で現在のサイズより小さな値を指定した場合はサイズより大きい部分のデータは切り詰められる。それ以外の場合はデータは温存される。
戻り値
成功時には新たな容量を返す。それ以外の場合は空文字列を返す。

GetCapacity メソッド[編集]

MaxItems := Object.GetCapacity()
ByteSize := Object.GetCapacity(Key)

オブジェクトに格納可能なフィールドの容量、または該当キーのフィールドに割り当てられているメモリ容量、を返す。

GetAddress メソッド[編集]

Ptr := Object.GetAddress(Key)

該当キーのフィールドの文字列バッファのメモリアドレスを返す。

NewEnum メソッド[編集]

Enum := Object._NewEnum()

キーと値の組を列挙する Enumrator オブジェクトを返す。

Clone メソッド[編集]

オブジェクトのシャローコピーを返す。

Clone := Object.Clone()

HasKey メソッド[編集]

オブジェクトが指定キーのフィールドを持つかどうかを調べる。

boolean := Object.HasKey(Key)
Key 任意のキー

註釈[編集]

※1 整数キーで格納された値の並び。

オブジェクトに整数キーで値を格納する場合格納する順序によってパフォーマンスに大きな違いが出る可能性がある。

例えば以下のように 1, 10 の二つのキーで値が格納した場合を考える。

array := Object()
array[1]  := 1
array[10] := 10

このときオブジェクトの内部では下表のように、整数キーの値はキーの昇順に並んで格納されている。

内部の並び順 配列インデックス 備考
1 1
2 10

例えばここに、キー 5 で値を格納した場合は結果として以下のようになる:

内部の並び順 配列インデックス 備考
1 1
2 5 新規に挿入されたキー
3 10 内部の序列が一つ後ろにシフト

つまり既存キーの最大値よりも小さなキーでデータを追加しようとした場合、どうしても内部のデータの並び替えは避けられない。

ではこれがどれほどのパフォーマンスの差に繋がるかはサンプルスクリプトを実行して実際に確かめてみて欲しい。

#NoEnv
SetBatchLines, -1
count := 100000
; 昇順
array := Object()
startAt := A_TickCount
index := 0
While index++ < count
  array[index] := True
d1 := A_TickCount - startAt
; 降順
array := Object()
startAt := A_TickCount
index := count + 1
While index-- > 1
  array[index] := True
d2 := A_TickCount - startAt
MsgBox, % d1 "`n" d2

実行環境にもよるが、筆者の環境では両者に対数級の差がでた。 数の少ない場合は殆ど考慮しなくても良いだろうが、1000を超えるような要素を扱う場合はその格納順序に気を付けるべきだろう。