0

我对 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 和 Internet 都没有运气。

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

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

感谢大家!

4

1 回答 1

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 + 字符串“尾部”的长度)

更新(感谢 AutomatedChaos):

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

更新二(在评论中回答尤金的问题):

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

于 2012-08-08T12:16:42.337 回答