Тема: VBS: Byref и ByVAl (переопределение)
Изучаю передачу аргумента по значению и по ссылке и пытаюсь разобраться.
Но вот https://msdn.microsoft.com/ru-ru/library/ee478101.aspx написан код, который выдает совсем другой результат и не работает, так как написано в справке, поясните пожалуйста почему?
Function TestFunction(MyParam1, MyParam2)
' Both parameters are ByRef, because neither ByRef nor ByVal
' is specified for either parameter.
TestFunction = MyParam1 * MyParam2
MyParam1 = 5
MyParam2 = 6
End Function
Dim MyArg1, MyArg2, Result
MyArg1 = 123
MyArg2 = 124
Result = TestFunction ((MyArg1), MyArg2)
' MyArg1 is still 123.
' MyArg2 is changed in TestFunction to 6.
Так как ответ не 123*6 = 615, а
123*124 = 15252
Почему ?
почему код не отрабатывается так как надо.
...TestFunction ((MyArg1),...
Вызов функции в таком виде, передает параметр MyArg1 в тело функции в список аргументов функции - по значению (ByVal) MyArg1 = 123,
так как круглые скобки переопределили, что параметр передается не по ссылке, а по значению...
Поэтому и непонятно почему не отрабатывается функция, так как я только изучаю VBScript...
Если записать вот так
Result = TestFunction(MyArg1,MyArg2)
или так
Result = TestFunction((MyArg1),(MyArg2))
Ответ все равно 123*124
Если параметр определяется как ByRef, аргумент может быть передан по значению, если он находиться в круглых скобках.
Это показано в следующем примере.
Sub TestSub(ByRef MyParam)
MyParam = 5
result = MyArg
MsgBox "result - " & result
End Sub
Dim MyArg
MyArg = 123
TestSub (MyArg)
' MyArg is still 123.
Параметр ByRef передается по значению, если аргумент находиться в закрытых скобках и данные скобки не применяются к списку аргументов.
Данные закрытые скобки применяются к списку аргументов, если одно из следующих условий верно:
• Данный оператор – это вызов функции (обращение к функции), которая назначена к возвращаемому значению.
Result = TestFunction (MyArg)
• Данный оператор использует ключевое слово Call. (Ключевое слово Call может необязательно быть использовано для вызова подпрограммы или для вызова функции без назначения.)
Call TestFunction (MyArg)