“cannot use parentheses”是个什么鬼

VBScript里你是怎么调用sub(子程序)的呢?
当然这样啊:

MySub1(MyArg)

可是,当别外一个sub有多个参数时呢?

MySub2(MyArg1,MyArg2)

它竟然出错!cannot use parentheses!不能使用括号!这是个什么鬼!
先说结论:如果你以一般方式调用sub时,参数是不能使用括号包着的。
只能这样:

MySub2 MyArg1,MyArg2

骗人,明明可以啊!……好吧……其实:

MySub1(MyArg)

程序的真正理解是:

MySub1 (MyArg)

注意中间有个空格!而(MyArg)的意思是:以ByVal的方式传递参数!
VBScript里调用函数(function)或子程序(sub)时,(定义function和sub时如果你没有声明ByVal)默认是以ByRef的方式传递参数的;如果function或sub已经定义了参数是ByRef的,你还可以强制以ByVal的方式传递参数,那就是给参数加上括号。所以:

MySub1 (MyArg)

的真正意思是:调用MySub1并且以ByVal的方式传递参数MyArg。
先记着结论:如果你以一般方式调用sub时,参数是不能使用括号包着的。所以:

MySub2(MyArg1,MyArg2)

会直接出错,正确的写法是:

MySub2 MyArg1,MyArg2

呃……一直在说以一般方式调用sub,那么不一般的方式是什么啊?
就是用Call来调用sub,并且用Call的时候参数必须用括号了:

MySub2(MyArg1,MyArg2)

总的来说:
括号在VB中的几个意思:

  1. 对括号内的表达式求值,例如:Average = (First + Last) / 2
  2. 引用数组的第几个元素,例如:Item = MyArray(Index)
  3. 调用函数(function)或子程序(sub),例如:Limit = UBound(MyArray)
    • 如果函数调用被赋值,那么它的参数必须使用括号:Result = MyFunc(MyArg)
    • 使用Call调用函数或子程序时它的参数必须使用括号:Call MySub(MyArg)
    • 如果不是以上两种情况,则不能使用括号。
  4. 强制以byval的方式传递参数:Result = MyFunction(Arg1, (Arg2)) ‘Arg1是byref,Arg2是byval

发表评论

电子邮件地址不会被公开。 必填项已用*标注