ByRef and ByVal in VBScript
vbscript
Solution
Eric Lippert has a great article on using parentheses in VBScript: What do you mean "cannot use parentheses?" Your example illustrates one of the points he mentions, namely: enclosing a `ByRef` argument in parentheses passes it as `ByVal`.
In short, parentheses in VBScript subroutine calls can be put not only around the argument list, but also around individual arguments (in which case they are forced `ByVal`). And VBScript only expects the argument list be enclosed in parentheses if the `Call` keyword is used. Since the `IncrementByRef(Num)` call doesn't use the `Call` keyword, VBScript treats parentheses as applied to the subroutine argument and thus passes it `ByVal` instead of `ByRef`.
Confusing, but that's the way it works.
Problem
I'm facing something weird in VBScript. When writing a procedure where I want the parameter to be passed by reference, the way of calling this procedure changes the way the parameter is passed ! Here is an example : ``` Sub IncrementByRef(ByRef Value) Value = Value + 1 End Sub Sub IncrementByVal(ByVal Value) Value = Value + 1 End Sub Dim Num Num = 10 WScript.Echo "Num : " & Num IncrementByRef(Num) : WScript.Echo "IncrementByRef(Num) : " & Num IncrementByRef Num : WScript.Echo "IncrementByRef Num : " & Num IncrementByVal(Num) : WScript.Echo "IncrementByVal(Num) : " & Num IncrementByVal Num : WScript.Echo "IncrementByVal Num : " & Num ``` And here is the output : ``` U:\>cscript //nologo byrefbyval.vbs Num : 10 IncrementByRef(Num) : 10 IncrementByRef Num : 11 IncrementByVal(Num) : 11 IncrementByVal Num : 11 U:\> ``` When specifying the the parameters are passed ByVal, it works as expected, no matter the way the procedure is called. But when specifying the parameters are passed ByRef, it will work as expected if calling the procedure this way : ``` IncrementByRef Num ``` but not this way : ``` IncrementByRef(Num) ``` This seems weird to me. Is there a way to make sure the parameters are passed ByRef, no matter how the procedure is called ?