NetBox 2.7 使用手册 |
在实际应用中,创建、使用可选参数,可以很大程度上使得函数的使用更加方便。我们可以考察下面的例子:
Sub Test(p1, p2, p3) Shell.Console.WriteLine VarType(p1) & ", " & VarType(p2) & ", " & VarType(p3) End Sub Test 1, 2, 3 Test 1, , 3 Test , , 3 Test 1, 2
在上面的代码中,我们创建了一个子程序 Test,并且设定了三个参数 p1、p2、p3,然后分别以不同的方式调用这个子程序,来察看不同情况下的参数传递情况。运行这个程序,可以看到下面的运行结果:
2, 2, 2 2, 10, 2 10, 10, 2 Microsoft VBScript runtime error Error Number: 800A01C2 File: \test.box Line: 8 Description: Wrong number of arguments or invalid property assignment: 'Test'
在运行的结果中,我们稍加比较,便可以发现,凡是在调用子程序时传递了整数的位置,都输出的变量类型为 2(vbInteger),而未传递参数的位置则变量类型则为 10(vbError)。然而在我们希望省略最后一个参数的时候出了麻烦,VBScript 报告了一个错误,说是错误的参数个数。
是的,这是 VBScript 的局限,在调用子程序或者函数时只允许省略除最后一个参数以外的参数。于是我们没有办法利用 VBScript 构建出一个使用方便的子程序或者函数。
在实现 NetBox 的 wsc 脚本部件的时候,我们充分考虑了这种需求,并给出了解决方案。脚本部件的创建者可以创建出允许随意省略参数的方法,极大方便了脚本部件的可用性。我们可以察看下面的脚本部件代码:
<?xml version="1.0"?> <component> <registration description="test" progid="NetBox.test" classid="{5beeff5e-368c-4015-9ccd-077cb5a2946d}"/> <public> <method name="Test"/> </public> <script language="VBScript"> <![CDATA[ Sub Test(p1, p2, p3) Shell.Console.WriteLine VarType(p1) & ", " & VarType(p2) & ", " & VarType(p3) End Sub ]]></script> </component>
我们实现了和刚才同样的子程序,不同的是在 wsc 脚本部件中实现的,并且在描述中声明了 Test 方法引出了这个子程序。下面我们创建一个脚本注册并测试这个脚本部件:
NetBox.RegisterClass "\test.wsc" Set t = CreateObject("NetBox.Test") t.Test 1, 2, 3 t.Test 1, , 3 t.Test , , 3 t.Test 1, 2
再运行这段代码,并察看结果:
2, 2, 2 2, 10, 2 10, 10, 2 Microsoft VBScript runtime error Error Number: 800A01C2 File: \test.box Line: 8 Description: Wrong number of arguments or invalid property assignment: 't.Test'
哈哈,输出了几乎更刚才同样的结果。当然了,原因是没有描述参数个数,脚本部件不能正确处理所传递的参数。我们修改脚本部件,增加参数描述部分:
<?xml version="1.0"?> <component> <registration description="test" progid="NetBox.test" classid="{5beeff5e-368c-4015-9ccd-077cb5a2946d}"/> <public> <method name="Test"> <parameter name="p1"/> <parameter name="p2"/> <parameter name="p3"/> </method> </public> <script language="VBScript"> <![CDATA[ Sub Test(p1, p2, p3) Shell.Console.WriteLine VarType(p1) & ", " & VarType(p2) & ", " & VarType(p3) End Sub ]]></script> </component>
在上面的代码中,我们在描述 Test 方法的时候为其描述了参数,根据描述,脚本部件引擎便可以清楚的了解这个方法所需要的参数情况,在引用这个方法的时候,引擎就会根据这个情况对调用参数进行处理,以满足实际的参数情况。我们可以再执行测试程序察看结果:
2, 2, 2 2, 10, 2 10, 10, 2 2, 2, 10
耶!
单纯的省略参数没有什么意义的,但是我们可以利用省略参数创建出令人激动的程序来。比如下面的代码:
... Sub Test(p1, p2, p3) If VarType(p3) = 10 Then p3 = "This is a default string." ... End Sub ...
这样,当我们调用此方法并省略了 p3 的时候,便是表示 p3 使用缺省值“This is a default string.”。另外一种运用是下面的方式:
... Sub Test(p1, p2, p3) If VarType(p3) = 10 Then Test2 p1, p2 Else Test3 p1, p2, p3 End Sub ...
我们可能在发现用户只传递了两个参数的时候和传递了三个参数的时候分别调用两个完全不同的子程序以完成不同的动作,从而利用同样的方法命名实现完全不同的功能。
省略参数和缺省参数是一项令人激动的技术,可以让应用更加方便易用,轻易的创建专业的脚本对象。