VBScript的輸入非常微弱。所有變量都是變體(不同的子類型:整數,字符串,對象,...)。集合可以包含所有子類型的項目;這些項目甚至可以是不同的子類型。
即使是字典的鍵也不一定是字符串;它們也可以是對象。 WRT this question concerning Dictionaries and Arrays,我必須添加:數組可以是相關的,但一個字典的未鍵:
>> 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
A亞型要小心是固定陣列(具有Dim a(ConstNumber)
定義)。這些元素相當不受限制,但如果可以將固定數組放入集合中,我會感到驚訝。
更新(WRT固定陣列):
固定陣列和它的元素存儲在,以提高性能的一些特殊的方式。我對細節一無所知,但它是一種特殊類型的數組(不能增長)。
將某些東西放到一個集合中意味着:放入一些東西(類型+值(s))。如果東西是一個簡單的變量或數組,則會鬆開與原始的連接(再次考慮指向這個出,@Ansgar)。如果東西是一個對象,引用(對象)的副本仍然允許您訪問原始數據。
一個固定陣列是進入集合(OK,測試僅使用一本字典)的副本失去的特殊類型:
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
不一樣,不能成長。
將固定數組添加到例如字典或數組列表工作得很好AFAICS。爲什麼它不適用? – 2013-02-26 22:22:57