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(...), с зарегистрированными именами и результатом конкретной команды.


en · ru · uk · fr · de · it · es · zh-tw · ja · ko

Basic