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
4

1 に答える 1

1

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それは成長できないのと同じタイプではありません。

于 2013-02-26T18:13:51.497 に答える