API Basic NamedArguments - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
Named arguments / :=
ClassicUO • Basic
Именованные аргументы связывают значения с именами параметров, поэтому порядок записи может отличаться от объявления. Поддерживаются процедуры и функции скрипта, вызовы модулей, зарегистрированные функции Basic/UO и методы нативных объектов.
Точный синтаксис
FunctionName(parameterName:=expression, otherName:=expression)
FunctionName(positionalExpression, optionalName:=expression)
FunctionName([reservedName]:=expression)
Параметры
parameterName / [reservedName]— Указывайте точное имя из объявления или сигнатуры, без учёта регистра: name:=value. Зарезервированное имя заключайте в квадратные скобки, например [to]:=100. Это скобки имени параметра, а не индекс массива. Неизвестные и повторяющиеся имена вызывают ошибку.expression— Каждое переданное выражение вычисляется один раз слева направо в порядке записи вызова. Затем значения попадают в соответствующие параметры. Типы, границы и правила ByVal/ByRef остаются правилами вызываемой функции. Именованная запись не превращает значение в изменяемую переменную ByRef.positionalExpression / optionalName— Позиционные аргументы должны идти первыми; после первого именованного все остальные тоже именованные. Обязательные параметры пропускать нельзя. Пропущенные Optional в процедурах получают объявленные значения по умолчанию: они вычисляются по порядку объявления после переданных выражений. Нативные перегрузки принимают только зарегистрированные имена и количество аргументов, без придуманных значений по умолчанию.
Возвращает
Запись := сама по себе ничего не возвращает. Функция/API возвращает собственный результат; у Sub нет неявного результата. Примеры возвращают Integer 129 и строки "21:12", "20:10:2", а не признаки успеха Boolean.
Поведение
- Перед запуском проверяются известные сигнатуры: SC027 с файлом и строкой сообщает об ошибке имени, повторе, пропуске обязательного параметра либо неоднозначном вызове. Динамический объект проверяется при выполнении до вычисления его аргументов. Отсутствующая нативная перегрузка не заменяется вызовом без аргументов.
- Интерпретатор кеширует неизменяемую схему соответствия для статических мест вызова. Выражения вычисляются по порядку записи, а назначение параметров и обратная запись ByRef используют схему. Значения по умолчанию и параметры в отладчике относятся к выбранной сигнатуре. Динамический объект захватывается для текущего вызова, прежний объект не подставляется.
- ParamArray по имени передавать нельзя. При именованном вызове его можно оставить пустым; для передачи его элементов нужен полностью позиционный вызов. Пустые места между запятыми не поддерживаются. Это подмножество с правилом «позиционные сначала», без свободного смешивания из новых VB.NET. Новые потоки не создаются, игровые задержки не меняются.
Примеры
1. Пропустить необязательный параметр посередине
# Encode объявляет x, y=2, z=3. z:=9 сначала передаёт z, x:=1 затем передаёт x, а пропущенный y получает 2. Вычисляется 1*100+2*10+9=129. Позиционный эквивалент: Encode(1,2,9). Также допустимо Encode(1,z:=9).
Option Explicit On
Function Encode(ByVal x, Optional ByVal y=2, Optional ByVal z=3) As Integer
Return x*100 + y*10 + z
End Function
Sub Main()
Dim encoded = Encode(z:=9, x:=1)
Return encoded
End Sub
Разбор параметров и выполнения:
Encode объявляет x, y=2, z=3. z:=9 сначала передаёт z, x:=1 затем передаёт x, а пропущенный y получает 2. Вычисляется 1100+210+9=129. Позиционный эквивалент: Encode(1,2,9). Также допустимо Encode(1,z:=9).
2. Изменить нужные переменные через ByRef
# Change объявляет ByRef left и right. right:=a связывает a=1 с right, left:=b — b=2 с left. Процедура добавляет 10 к left и 20 к right, после чего записывает обратно b=12 и a=21. Main возвращает "21:12". Имя слева от := выбирает параметр, выражение справа — переменную вызывающего скрипта.
Option Explicit On
Sub Change(ByRef left, ByRef right)
left += 10
right += 20
End Sub
Sub Main()
Dim a = 1
Dim b = 2
Change(right:=a, left:=b)
Return CStr(a) & ":" & CStr(b)
End Sub
Разбор параметров и выполнения:
Change объявляет ByRef left и right. right:=a связывает a=1 с right, left:=b — b=2 с left. Процедура добавляет 10 к left и 20 к right, после чего записывает обратно b=12 и a=21. Main возвращает "21:12". Имя слева от := выбирает параметр, выражение справа — переменную вызывающего скрипта.
3. Передать именованные параметры коллекции
# List() создаёт пустой список. Add(value:=10) добавляет 10 без возврата значения. Insert(value:=20,index:=0) вставляет 20 на индекс 0 и сдвигает 10 на индекс 1. Item(index:=...) возвращает элемент; Count() возвращает 2. Main составляет "20:10:2". Те же правила действуют для UO.Name(...), с зарегистрированными именами и результатом конкретной команды.
Option Explicit On
Sub Main()
Dim items = List()
items.Add(value:=10)
items.Insert(value:=20, index:=0)
Dim first = items.Item(index:=0)
Dim second = items.Item(index:=1)
Return CStr(first) & ":" & CStr(second) & ":" & CStr(items.Count())
End Sub
Разбор параметров и выполнения:
List() создаёт пустой список. Add(value:=10) добавляет 10 без возврата значения. Insert(value:=20,index:=0) вставляет 20 на индекс 0 и сдвигает 10 на индекс 1. Item(index:=...) возвращает элемент; Count() возвращает 2. Main составляет "20:10:2". Те же правила действуют для UO.Name(...), с зарегистрированными именами и результатом конкретной команды.