我遇到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
谢谢大家!
答案 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”被“真实”名称替换)。