1

Тема: 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)

2

Re: VBS: Byref и ByVAl (переопределение)

sat-tim пишет:

Так как ответ не 123*6 = 615, а
123*124 = 15252
Почему ?
почему код не отрабатывается так как надо.

Ну, видимо, потому, что значения параметров изменяются внутри функции уже после того, как вычислен результат. А он вычисляется ещё со старыми их значениями.

3

Re: VBS: Byref и ByVAl (переопределение)

значения параметров изменяются внутри функции уже после того, как вычислен результат. А он вычисляется ещё со старыми их значениями

Что вы понимаете под старыми значениями ?

Ведь

MyArg1 = 123
MyArg2 = 124

Это новые значения и результат вычисляется с ними

4

Re: VBS: Byref и ByVAl (переопределение)

Нет, это старые, которые существуют до вызова функции. А 5 и 6 присваиваются во время её вызова, но уже после вычисления её возвращаемого значения.

То, что определение функции располагается в начале скрипта, не значит, что её код там же и выполняется. Он выполняется при её вызове.

5

Re: VBS: Byref и ByVAl (переопределение)

Получается тогда так:

Result = TestFunction[b] ((MyArg1), MyArg2)[/b]

Вызываемая функция получает значения переменных

MyArg1 = 123
MyArg2 = 124

в свой список аргументов (MyParam1, MyParam2),
в теле функции аргументы

MyParam1, MyParam2 получают значения

MyParam1 = 123
MyParam2 = 124
, и эти значения передаются в выражение

 TestFunction = MyParam1 * MyParam2

где, происходит их вычисление, и затем результат возвращается
значением  123*124 = 15252

Так ?

Ну тогда как понять этот пример в контексте справки на сайте microsoft, в которой описывается механизм передачи параметров ByVal  и ByRef, это еще больше сбивает с толку, так же как и описание механизма переопределения передачи аргументов.

тогда как должен выглядить скрипт, наглядно показывающий эти механизмы ?

6

Re: VBS: Byref и ByVAl (переопределение)

Разница этих механизмов в следующем. Передача по значению — это копирование числа 123 из переменной MyArg1 в переменную MyParam1. Передача по ссылке — это копирование адреса переменной MyArg2 в переменную MyParam2. Имея адрес внешней переменной, вы можете как считывать оттуда её значение, так и менять это значение в ней. В VBScript в эти подробности вникать не надо, просто можно считать, что MyParam2 — это то же самое (та же переменная), что и MyArg2, только под другим именем. А вот MyArg1 и MyParam1 — это две разных переменных, просто значение одной копируется в другую при вызове функции. Поэтому, меняя MyParam1 внутри функции, вы никак не влияете на MyArg1.