Can a VBScript function return a dictionary?

2020-08-23 04:39发布

问题:

I have a dictionary of form data that I want to modify using a function.

function queryCleanForm(myDictForm)

    dim arrayKeys
    arrayKeys = myDictForm.keys

    for i=0 to myDictForm.count-1
        myDictForm(arrayKeys(i)) = replace(myDictForm(arrayKeys(i)), "'", "''")
        response.write myDictForm(arrayKeys(i))
    next

    queryCleanForm = myDictForm
end function

The problem is the line queryCleanForm = myDictForm errors as

Wrong number of arguments or invalid property assignment 

Is there a way to do this in VBScript?

回答1:

Try this:

SET queryCleanForm = myDictForm

With objects you need to use SET to tell VBScript that it is an object reference you are assigning not a value type.



回答2:

Yes, you need to use the SET command:

Set queryCleanForm = myDictForm



回答3:

You can also use the ByRef or ByVal values in the function. ByVal, the object you sent to a function or sub is copied into private memmory to be used inside the function and discarded after the function is completed. ByRef, the object you sent to a function is referenced to and all manipulations you make, removing keys, setting the object etc, is directly done to the object you sent.

E.g.

Sub test
   DIM testDict as variant
   call setdict(testDict)

   testDict.Add "test", "value" 

   call addValue(testDict, "test2","another value")

   msgbox testDict.Count

   Set testDict = Nothing
End Sub

Sub setdict(ByRef in_Dict as Variant)
  If Typename(in_Dict) <> "Dictionary" Then
    SET in_Dict  = CreateObject("Scripting.Dictionary")
  end if
end sub

sub addValue(ByRef in_Obj as Variant, ByVal in_Key as String, ByVal in_Value as String)
 if not in_Obj.Exists(in_Key) then
     in_Obj.Add in_Key, in_Value
 end if
end sub

The test sub calls with a variable of type variant to the sub setdict. In the function I validate the type of the object sent to the sub. If the object type is not a dictionary object (which it is not) then the object in_Dict which is actually the testDict object declared in the sub test, will be set to a dictionary object.

To demonstrate the reference better I also included the second sub called addvalue. I pass the object to the function again as reference and add another key to the dictionary object. In the main test sub ill then post the count. In this case there are 2 keys present.