VBScript は、型付けが非常に弱いです。すべての変数はバリアントです (さまざまなサブタイプ: 整数、文字列、オブジェクトなど)。コレクションは、すべてのサブタイプのアイテムを保持できます。アイテムは異なるサブタイプであってもかまいません。
ディクショナリのキーでさえ、文字列である必要はありません。オブジェクトにすることもできます。Dictionaries と Arrays に関するこの質問にWRTを追加する必要があります。配列は項目にすることができますが、辞書のキーにすることはできません。
>> Set d = CreateObject("Scripting.Dictionary")
>> d.Add "Company", Array("microsoft", "apple")
>> WScript.Echo Join(d("Company"))
>> a = d("Company") <== array assignment in VBScript COPIES!
>> a(1) = "samsung"
>> WScript.Echo Join(a)
>> WScript.Echo Join(d("Company"))
>>
microsoft apple
microsoft samsung
microsoft apple
>> d.Add a, "won't work"
>>
Error Number: 5
Error Description: Invalid procedure call or argument
注意すべきサブタイプは Fixed Array ( で定義Dim a(ConstNumber)
) です。要素はかなり制限されていませんが、Fixed Array をコレクションに入れることができたら驚きです。
更新(固定配列を書く):
固定配列とその要素は、パフォーマンスを向上させるために特別な方法で格納されます。詳細はわかりませんが、特殊なタイプの配列です(拡張できません)。
コレクションに何かを入れるということは、何かのコピー (型 + 値) を入れることを意味します。何かが単純な変数または配列である場合、元のものへの接続が失われます (これを指摘するためにもう一度考えてみてください、@Ansgar )。何かがオブジェクトである場合、参照 (オブジェクト) のコピーから元のデータにアクセスできます。
コレクションに入る Fixed Array のコピー (わかりました、テストは辞書のみを使用します) は、特別な型を失います:
Option Explicit
Dim Af(0) : Af(0) = "fixed"
ReDim Ad(0) : Ad(0) = "dyn"
WScript.Echo 0, Af(0), Ad(0)
Dim dicX : Set dicX = CreateObject("Scripting.Dictionary")
dicX(0) = Af
dicX(1) = Ad
WScript.Echo 1, dicX(0)(0), dicX(1)(0)
Af(0) = UCase(Af(0))
Ad(0) = UCase(Ad(0))
WScript.Echo 2, Af(0), Ad(0)
WScript.Echo 3, dicX(0)(0), dicX(1)(0)
grow dicX(0)
grow dicX(1)
WScript.Echo 4, Join(dicX(0)), Join(dicX(1))
grow Ad
WScript.Echo 5, Join(Ad)
grow Af
Sub grow(a)
ReDim Preserve a(Ubound(a) + 1)
a(1) = "array"
WScript.Echo "**", Join(a)
End Sub
出力:
cscript doa.vbs
0 fixed dyn
1 fixed dyn
2 FIXED DYN
3 fixed dyn
** fixed array
** dyn array
4 fixed dyn
** DYN array
5 DYN array
E:\trials\SoTrials\answers\15008949\vbs\doa.vbs(23, 3) Microsoft VBScript runtime error: This array is fixed or temporarily locked
この** fixed array
行は、渡された配列が固定されgrow
ていないことを証明しています。Af
それは成長できないのと同じタイプではありません。