有没有办法在 vb 脚本中为函数创建可选参数?

问题描述 投票:0回答:6

有没有方法可以在 vb 脚本中为函数创建可选参数,从而允许您编写类似于...的函数

myFunc("happy")
myFunc("happy", 1, 2, 3)
myFunc("happy", 1)
etc.
vbscript
6个回答
18
投票

vbscript 中不允许使用可选关键字(如 VB6)

也许这有帮助: https://web.archive.org/web/20210304114036/http://www.4guysfromrolla.com/webtech/071801-1.shtml


3
投票

超载怎么样?


3
投票

您始终可以将其设为

class
并在调用之前使用
Public Property Let
填充您的
Sub
/
Function

  Set oSubName = New cSubName

    'fill your parameters, you can always add more later
    oClass.OptionalParameter1 = true
    oClass.OptionalParameter2 = false

    'execute sub
    oSubName.Execute

  Set oSubName = Nothing

这需要一些有关如何创建类的知识,但可能是使用数组的下一个最佳解决方案。

祝你好运。


1
投票

显然,这取决于您的环境以及它是否支持在同一文件中同时使用 JScript 和 VBScript,但我使用 Windows Script Host(*.wsf 文件)取得了一些成功,即

<?xml version="1.0" standalone="yes" ?>
<package xmlns="Windows Scripting Host">
    <job id="param">
    <?job debug="true"?>

        <script language="JavaScript">
            <![CDATA[
                function MakeString(args) {
                    var s = [];
                    for(var i = 0, length = arguments.length; i < length; i++)
                        s.push(arguments[i]);
                    return s.join('');
                }
            ]]>
        </script>
        <script language="vbscript">
            <![CDATA[
                WScript.Echo MakeString("hello", " ", "world")
                WScript.Echo MakeString()
                WScript.Echo MakeString(1,2,3,4)
            ]]>
        </script>
    </job>
</package>

您可以在 JScript 中定义函数并在 VBScript 中引用它。更好的方法可能是将 JScript 函数作为外部文件包含在内,即

    <script language="JavaScript" src="makestring.js"/>
    <script language="vbscript">
        <![CDATA[
            WScript.Echo MakeString("hello", " ", "world")
            WScript.Echo MakeString()
            WScript.Echo MakeString(1,2,3,4)
        ]]>
    </script>

0
投票

要在 VBScript 函数中使用可选参数,您可以使用 IsArray 函数来确定传递的参数是单个值还是参数数组。

下面是一个具有两个必需参数的函数示例,即 argRequired 和 argFields(假设后者不是数组)。通过显式指定,可以将任意数量的必需参数添加到函数中。

Function myFunc(ByVal argRequired, ByVal argFields)

    Field_0 = argRequired
    Field_1 = "Default 1"
    Field_2 = "Default 2"
    Field_3 = "Default 3"
    Field_4 = "Default 4"
    ' ...

    If IsArray(argFields) Then
        For I = 0 to UBound(argFields)
            Select Case I
                Case 0    Field_1 = argFields(I)
                Case 1    Field_2 = argFields(I)
                Case 2    Field_3 = argFields(I)
                Case 3    Field_4 = argFields(I)
                ' ...
            End Select
        Next
    Else
        Field_1 = argFields
    End If
    
    ' my code

End Function

调用不带可选参数的函数:

myFunc("first", 100)

要调用带有可选参数的函数,请将最后一个必需参数和所有可选参数封装在一个数组中:

myFunc("first", Array(100, "third", 200, False))

在第一种情况下,myFunc 将看到第二个参数不是数组并将其作为项目处理。

在第二个中,myFunc 将第二个参数作为参数数组进行处理,并相应地解析数组项。 Select 语句用于允许数组中存在可变数量的可选参数,而不是需要固定的数组大小。

注意:如果只需要一个参数,argRequired 可以省略:

Function myFunc(ByVal argFields)

    Field_1 = "Default 1"
    Field_2 = "Default 2"
    ' ...

    If IsArray(argFields) Then
        For I = 0 to UBound(argFields)
            Select Case I
                Case 0    Field_0 = argFields(I)
                Case 1    Field_1 = argFields(I)
                Case 2    Field_2 = argFields(I)
                ' ...
            End Select
        Next
    Else
        Field_0 = argFields
    End If
    
    ' my code

End Function

-5
投票

只需传递一个不同的类型并查看即可。

wscript.echo "1: " & math(7,8,false)
wscript.echo "2: " & math(7,8,5)
wscript.echo "3: " & math(15,false,5)

function math( Addend1 , Addend2, Divisor )
dim tmpTotal

if Addend2 then
   TmpTotal = Addend1 + Addend2
else
   tmpTotal = Addend1
end if


if Divisor then     'if argument Divisor is other than False then do it.
   if Divisor > 0 then  'Hated Divide by Zero since VIC-20.
      tmpTotal = tmpTotal / Divisor)
   end if
end if

end function
© www.soinside.com 2019 - 2024. All rights reserved.