VBS:变量未通过递归表达式赋值

时间:2012-08-08 11:46:12

标签: variables vbscript expression

我遇到VBS变量值赋值问题:

Dim varName  
varName = function(x, y)
varName = function(x, y)

function 是一个递归函数,它自称:

Function function(x, y)
    If IsObject(dicColumnIndices) Then
        function = CInt(dicColumnIndices.Item(y))
    Else
        Set oCDSGrid = %MyAppObject%
        Set dicColumnIndices = CreateObject("Scripting.Dictionary")
        intColumnCount = oCDSGrid.ActiveSheet.Columns.Count
        For i = 0 To intColumnCount - 1
            dicColumnIndices.Add oCDSGrid.ActiveSheet.Columns.Item(i).Label, i
        Next

        function x, y
    End If
End Function

据我所知,变量值赋值仅在第二次尝试时发生。我认为它与我的函数递归调用自身有关(如果我删除了递归调用,问题就消失了),但我非常想知道这种行为的根源是什么。

我没有运气地查看了StackOverflow和互联网。

编辑: 为了解决这个问题,我不得不删除递归调用:

Function function(x, y)
If IsObject(dicColumnIndices) Then
    function = CInt(dicColumnIndices.Item(y))
Else
    Set oCDSGrid = %MyAppObject%
    Set dicColumnIndices = CreateObject("Scripting.Dictionary")
    intColumnCount = oCDSGrid.ActiveSheet.Columns.Count
    For i = 0 To intColumnCount - 1
        dicColumnIndices.Add oCDSGrid.ActiveSheet.Columns.Item(i).Label, i
    Next

    function = CInt(dicColumnIndices.Item(y))
End If
End Function

编辑2:最后,在MSDN的帮助下,我得到了错误的部分 - 这是第二次调用

function x, y

将值返回为空,必须更改为:

function = function x, y

谢谢大家!

1 个答案:

答案 0 :(得分:1)

函数不应该被称为函数,而varname是变量的糟糕名称。更重要的是:在VBScript中,如果你没有“赋值函数”,函数不是函数(不返回某些东西):

  Dim s : s = "abcdefg"
  Dim l : l = recLen(s)
  WScript.Echo "recursive length of", qq(s), "=>", l, CStr(l = Len(s))

  Function recLen(s)
    If "" = s Then
       recLen = 0
    Else
       recLen = 1 + recLen(Mid(s, 2))
    End If
  End Function

(空字符串的长度为0;对于较长的字符串,它是1 +字符串'tail'的长度)

更新(感谢AutomatedChaos):

Function qq( vStringable )
  qq = """" & vStringable & """"
End Function

更新II(在评论中回答Eugene的问题):

要使函数返回某些内容,您必须分配该值以返回与该函数同名的变量。您的原始代码没有(即使名称“function”被“真实”名称替换)。