2013-02-26 118 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

相关问题