(for Internet Explorer)
の要素を順番にたどっていくクラスです。
Dim  a : Set a = new ArrayClass
Dim  iter : Set iter = a.NewIterator()
While iter.HasNext()
  echo  iter.GetNext()
WEnd
サンプル
メンバー
参考
→ イテレーター (JavaScript 1.7)
次の要素を返す。 次回の呼び出しでは、その次の要素を返す。
次の要素があるかどうか
取得
(src)
次の要素を返す。 次の要素が無いときは、番兵を返す。
テスト
→ T_Arr_Target # [T_ArrIter]
Function  ArrayClassIterator::GetNext() as variant
次の要素を返す。 次回の呼び出しでは、その次の要素を返す。
Java2 の Iterator パターン、JavaScript 1.7 のイテレーターでは、next に相当します。
Next は、VB言語の予約語であることと、Me に副作用があるため、プロパティではなくメソッド
であり、メソッドは動詞で始まる方が読みやすいため、GetNext に変更しています。
補足
次の要素が無いときは、エラーになります。 エラーにしたくないときは、
を使ってください。
Function  ArrayClassIterator::HasNext() as boolean
次の要素があるかどうかを返す。
  Dim  f, line, a, elem, iter
  Set a = new ArrayClass : a.Add  new Elem
  Set iter = a.NewIterator
  Set sentinel = new Elem
  Set elem = iter.GetNextOrSentinel( sentinel )

  Set f = OpenForRead( path )
  Do Until  f.AtEndOfStream
    line = f.ReadLine()
    If elem.IsMatch( line ) Then  '// ここで番兵が使われることがある
      ...
      elem = iter.GetNextOrSentinel( sentinel )
              '// GetNext ではここでエラーになってしまうことがある
    End If
  Loop
  f = Empty
  elem = Empty
  iter = Empty
Function  ArrayClassIterator::GetNextOrSentinel( Sentinel as variant ) as variant
次の要素を返す。 ただし、次の要素が無いときは、Sentinel 引数(番兵)を返す。
サンプル:
GetNextOrSentinel
GetNextOrSentinel
標準の
の Item を、配列にしたクラスです。
  Dim  dic

  Set dic = new ArrayDictionary
  dic.Add  "key1", "item11"
  dic.Add  "key1", "item12"
  dic.Add  "key1", "item13"
  dic.Add  "key2", "item21"
  dic.Echo

  Dim  i,j
  For Each j in dic.Dic.Items() : For Each i in j.Items
    WScript.Echo  i
  Next : Next
item11
item12
item13
item21
上記スクリプトの出力
サンプル:
VBScript 標準の Dictionary (プロパティ)
メンバ
キーに要素を登録する。キーは重複可能
すべての要素を削除します
すべての要素を表示する
要素の数
1つのキーに対して、複数のアイテムを関連付けするときに使います。
(src)
テスト
→ T_Arr_Target.vbs [T_ArrayDic1]
Dim  ArrayDictionary::Dic  as Dictionary of variant
ArrayDictionary クラスがラップしている辞書です。
要素(Item)は、オブジェクトでもそれ以外でも格納します。
(src)
Sub  ArrayDictionary::ToEmpty()
辞書に要素を空にします。 要素数は 0 になります。
(src)
Sub  ArrayDictionary::Add( Key as string, Item as variant )
辞書に要素を追加します。
Item
(src)
Function  ArrayDictionary::Count() as integer
辞書の要素数を返します。
1つのキーに複数の要素が関連付けされることがあるので、
要素数はキーの数と一致しないことがあります。
(src)
Sub  ArrayDictionary::Echo()
辞書のすべての要素を表示します。
(src)
配列 (Array)
Sub  AddArrElem( Dst, Src )
配列の要素を追加コピーします。
【引数】
Dst
Arr
コピー先配列。 この配列の末尾に追加
コピー元の要素が入った配列、またはコピー元の単体。
これまで入っていた要素の後に追加します。
→ AddElems (ArrayClass)
Dst には、Me.Property 形式ではなく、Property 形式にしてください。(下記)
  AddArrElem  Me.SampleArray, Array( 1,2 )
×:追加されない
  AddArrElem  SampleArray, Array( 1,2 )
○:追加される
Me.
  AddArrElem  arr1, arr2
  AddArrElem  arr1, new ClassA
関連
テスト
サンプル
→ T_Arr.vbs
T_Arr1
ソース
→ vbslib.vbs
Function  AddArrElemEx( Dst, Src, IsReturn ) as Dst or Empty
配列の要素を追加コピーします。(機能拡張版)
【引数】
Dst
Arr
コピー先配列。 この配列の末尾に追加
コピー元の要素が入った配列、またはコピー元の単体。
IsReturn
True = 返り値は追加コピーした内容、False = 返り値は Empty
参考
ソース
→ vbslib.vbs
input_array = Array( "a", "b", Array( "ca", "cb" ), "d", Array( "ea", "eb" ) )
FlatArray  out_array, input_array
Assert  IsSameArray( out_array, Array( "a", "b", "ca", "cb", "d", "ea", "eb" ) )
Sub  FlatArray( out_FlatArray as array, NestedArray as array )
配列の中に配列がネストして入っているとき、フラットにします。
【引数】
out_FlatArray
NestedArray
(出力) フラットにした配列
配列がネストして入っている配列
サンプル
テスト
→ T_Arr.vbs
T_FlatArray
ソース
→ vbslib.vbs
Sub  CopyArr( Dst, Src )
配列の要素をコピーします。
【引数】
Dst
Arr
コピー先
コピー元
(src)
Arr が配列ではないときは、Dst(0) に Src をコピーします。
Dst に ArrayClass::Items を指定してもコピーした内容は ArrayClass に格納されません。
ArrayClass::Copy を使ってください。
廃止されました。
Dim  arr() とすると arr = Array はできませんが、 Dim arr とすると arr = Array ができます。
Function  SearchInSimpleArray( InData as variant, InArray as array of variant,
              OutBaseNumOrArray as array of variant, DefaultOut as variant ) as variant
配列を検索して、別の配列の内容を返します。
【引数】
InData
InArray
配列の要素と比較する値。 数値、文字列など = で判定できるもの
InData を比較する値を要素に持つ配列
OutBaseNumOrArray に指定した配列の要素の1つなど
返り値
InData が InArray に見つからなかったときに出力する値
出力する値を要素に持つ配列。 または、出力の最小数値
DefaultOut
OutBaseNumOrArray
(src)
num = SearchInSimpleArray( "SymbolB", _
    Array( "SymbolA", "SymbolB" ), _
    Array( 1, 2 ), _
    Empty )
'// num = 2
num = SearchInSimpleArray( "SymbolB", Array( "SymbolA", "SymbolB" ), 5, Empty )
'// num = 6
関連
出力の最小数値が 5 で、2番目の配列要素にヒットしたので、5 + ( 2 -1 ) = 6 を返します。
サンプル
サンプル
Function  IsSameArray( Array1, Array2 ) as boolean
配列のすべての要素が等しいか判定します。
各要素は = で判定します。
(src)
テスト
ソース
→ T_Arr.vbs
T_IsSameArray
→ vbslib.vbs
Array1 = Empty, Array2 = Empty のときは、True を返します。
Array1, Array2 は、Empty, 配列型、ArrayClass 型のいずれかを指定できます。
関連
テスト
ソース
→ T_Arr.vbs
T_IsSameArrayOutOfOrder
→ vbslib.vbs
Function  IsSameArrayOutOfOrder( Array1 as array, Array2 as array, Option_ ) as boolean
配列のすべての要素が等しいか判定します。 ただし、順番が異なっていても等しいとします。
各要素は = で判定します。
Option_ 引数
Empty または、下記の論理和 (or) が指定できます。
c.StopIsNotSame
c は、g_VBS_Lib です。
違った要素を見つけた瞬間に、デバッガーで停止します
関連
(src)
Sub  ReverseObjectArray( in_out_Array, out_Array )
配列を内容(オブジェクトのみ)を逆順にします。
【引数】
in_out_Array
out_Array
配列。逆順にする前の内容
(出力) 逆順の配列の内容
配列の要素が、オブジェクト以外が入っていたり、Empty になっているとエラーになります。
Sub  RemoveObjectArray( in_out_Array, ElementObject )
オブジェクトが格納された配列から、指定したオブジェクトを除外します。
【引数】
in_out_Array
ElementObject
オブジェクトが格納された配列
除外するオブジェクト
ソース
→ vbslib.vbs
Sub  RemoveObjectsByNames( in_out_Array, Names as variant )
オブジェクトが格納された配列から、Name プロパティがマッチするオブジェクトを除外します。
【引数】
in_out_Array
Names
Name プロパティがあるオブジェクトが格納された配列
Name プロパティと比較するもの
ソース
Names が文字列のとき
Name プロパティと単純に比較します。
Names が RegExp 型のとき
Name プロパティと正規表現で比較します。
Names が配列型のとき
Names がオブジェクトのとき
Name プロパティと Name プロパティを比較します。
配列の要素のそれぞれについて、1つでのマッチしたら除外します。
要素は、文字列、RegExp、Name プロパティを持つオブジェクトを混在できます。
テスト
→ T_Arr.vbs
T_RemoveObjectsByNames
→ vbslib.vbs
Function  ArrayToNameOnlyClassArray( aArray as array of not object );
オブジェクトではない要素を持つ配列を、NameOnlyClass の配列に変換します。
【引数】
aArray
返り値
オブジェクトではない要素を持つ配列
NameOnlyClass の配列
関連
ソートできる配列にします。
サンプル:
arr = ArrayToNameOnlyClassArray( Array( "a", "b", "c" ) )
(src)
テスト
→ T_ShakerSort.vbs
T_SortByPath
Function  NameOnlyClassArrayToArray( aArray as array of object );
Name プロパティを持つオブジェクトの配列を、Name プロパティの値の配列に変換します。
【引数】
aArray
返り値
Name プロパティを持つオブジェクトの配列
Name プロパティの値の配列
関連
ソートできる配列から戻します。
(src)
テスト
→ T_ShakerSort.vbs
T_SortByPath
その他
g("${RootPath}") = "${${Target}/RootPath}"
g("${TargetA/RootPath}") = "C:\FolderA"
g("${TargetB/RootPath}") = "C:\FolderB"

g("${Target}") = "TargetA"
Assert  g("${RootPath}") = "C:\FolderA"
g("${Target}") = "TargetB"
Assert  g("${RootPath}") = "C:\FolderB"
g("${RootPath}") = "C:\FolderA"
Assert  g("${RootPath}") = "C:\FolderA"
元々、下記のように使われていた変数 ${RootPath} があるとします。
変数の値を、別の変数の値によって動的に変えたい場合は、下記のどちらの記述もできます。
g("${RootPath}") = "C:\Folder${Target}"

g("${Target}") = "A"
Assert  g("${RootPath}") = "C:\FolderA"
g("${Target}") = "B"
Assert  g("${RootPath}") = "C:\FolderB"
g("$\{") = "${"   '// $\ は $ に置き換わります
g("$\\") = "$\"
g("$\}") = "$}"
g("$A")  = "$A"   '// $ の後に { がないと、そのまま
(メモ) このエスケープにより、単純に "${" を検索すれば、それが展開すべき変数かどうかが
分かります。
辞書の値に、辞書のキーへの参照を入れて、遅延評価する辞書です。
LazyDictionaryClass のオブジェクトは名前空間に相当し、キーは変数名に相当します。
Set g = new LazyDictionaryClass
g("${RootPath}") = "C:\Folder${Target}"
g("${Target}") = "A"

Assert  g("${RootPath}") = "C:\FolderA"
キーは、${ 〜 } 形式(例: ${A})にしてください。 $〜 形式(例: $A)は、エラーになります。
キーの ${ 〜 } の中に "$", "{", "}" は使えませんが、他の記号、Unicode文字(日本語など)
は使えます。
g("${RootPath( TargetA )}") = "C:\FolderA"
g("${RootPath( TargetB )}") = "C:\FolderB"

target = "TargetA"
Assert  g("${RootPath( "+ target +" )}") = "C:\FolderA"
単純な変換関数であれば、関数をデータに置き換えることもできます。
下記の RootPath が、関数の代わりです。
キーが存在しなければ、エラーになります。
テスト
→ vbslib.vbs
ソース
Set g = new LazyDictionaryClass

g("${Array1}") = Array( "${Var}/1", "${Var}/2" )
g("${Array2}") = Array( "${Array1}", "${Var}/3", "${Var}/4", "${Var}/5" )
g("${Var}") = "x"
array1 = g("${Array1}")
array2 = g("${Array2}")

Assert  IsSameArray( array1, Array( "x/1", "x/2" ) )
Assert  IsSameArray( array2, Array( "x/1", "x/2", "x/3", "x/4", "x/5" ) )

For Each  value  In g("${Array2}")
    echo  value
Next
関連
g("${Var}") = True
Assert  g("${Var}") = True
Assert  g("Var=${Var}") = "Var=True"
式を参照すると、文字列になります。
キーの展開は参照時( g("${Var}") を Get するとき)に行われる(遅延評価である)ため、
キーを含むアイテム(値)を設定するときに、そのキーが定義されていなくても構いません。
例:上記 ${Target}。 つまり、連続して設定するときは、設定する順番を問いません。
参照時にキーが存在しないときは、エラーになります。 簡単な文字列変換関数なら、
辞書のデータに置き換えることができます。
→ 関数型プログラミング
Set g = new LazyDictionaryClass

g("${Workspace/Lib}")    = "FolderA"
g("${Workspace/Sample}") = "FolderB"

values1 = g.Each_( "${Workspace/${i}}", "${i}", Array( "Lib", "Sample" ) )
Assert  IsSameArray( values1, Array( "FolderA", "FolderB" ) )

formulas = g.EachFormula( "${Workspace/${i}}", "${i}", Array( "Lib", "Sample" ) )
Assert  IsSameArray( formulas, Array( "${Workspace/Lib}", "${Workspace/Sample}" ) )

values2 = g( formulas )
Assert  IsSameArray( values2, values1 )
Each_ や EachFormula を使えば、配列の要素をループ変数のように扱って変換できます。
また、辞書を参照するときに、配列を指定することもできます。
値( = の右)に配列を指定することができます。
また、配列の要素に、配列を値を持つ変数への参照を指定すると、ネストしないで展開されます。
$\{ と書くと、${ という文字列データができます。
→ T_LazyDictionary.vbs
オブジェクトの設定と参照ができます。
Set g("${Var}") = new NameOnlyClass
echo  g("${Var}").Name
キーが存在しないときに自動的にキーを追加しないため、文字列のスペルミスを防ぐことができます。
ただし、キーとアイテムが異なることが一般的である辞書型では、アイテムを調べなければ
文字列を知ることができないため、開発効率が落ちます。
そこで、キーの先頭が ">" から、アイテムと同じであるようなルールにするとよいでしょう。
Set g = new LazyDictionaryClass
g("${>Spell}") = "Spell"
Set g = new LazyDictionaryClass
g("${Var1}") = "Value1"
g("${Var2}") = "${Var1}-2"

g.Echo
Echo
<LazyDictionaryClass>
${Var1} = "Value1"
${Var2} = "${Var1}-2" = "Value1-2"
</LazyDictionaryClass>
Echo メソッドを呼び出すと、アイテムのキーと展開前の値と展開後の値が書かれたテキスト
エディターが開きます。 内容は、xml プロパティと同じです。
テキスト エディターで開く内容:
patch_path = g("${Repository_workspace}\Sample_Test_patch\patch")
辞書を参照するコードが長くなるときは、役割を説明する説明変数をローカルで(関数内のスコープ
をもつ変数を)活用するとよいでしょう
→ 説明変数
参考
g.DebugMode = True  '// [TODO] 追加
g("${Target}") = "B"
echo  g("${RootPath}")
下記のように、デバッグ・モードをオンにすると、設定した内容を echo 表示したり、参照時にキーを
1つずつ展開する様子を echo 表示します。
<DictionaryEx operation="Set" key="${Target}">B</DictionaryEx>
<DictionaryEx operation="Get" key="${RootPath}">
<Expand count="1">C:\Folder${Target}</Expand>
<Expand count="2">C:\FolderB</Expand>
</DictionaryEx>
echo 表示の内容:
Set g = new LazyDictionaryClass
Assert  g("${USERPROFILE}\Desktop") = "C:\Users\user1\Desktop"
OSの環境変数を参照することもできます。