2013-02-26 64 views
1

通常,數組的值不同,但使用Items方法從字典對象中提取數據時,數組的值不同。它執行不同數據類型的數據。數組可能具有不同數據類型的值

任何人都可以澄清我這一點,是否有可能數組具有不同數據類型的值?

Option Explicit 

Dim D, i, Arr 

Set D = CreateObject("Scripting.Dictionary") 

D.CompareMode = VbTextCompare 

D.Add "1", 56 

D.Add "2", 78 

D.Add "3", "John" 

D.Add "4", 100 

Arr = D.Items 

For i=0 to ubound(Arr) Step+1 

Msgbox Arr(i) 

Next 

回答

1

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不一樣,不能成長。

+0

將固定數組添加到例如字典或數組列表工作得很好AFAICS。爲什麼它不適用? – 2013-02-26 22:22:57

相關問題