Skip to content

API Basic ParamArray

Codex edited this page Sep 14, 2026 · 2 revisions

ParamArray

ClassicUO • Basic

Параметры передают данные в SUB/FUNCTION. ByRef позволяет записать изменённое значение обратно вызывающему коду; ByVal сохраняет его переменную. Optional задаёт значение при пропуске аргумента, ParamArray принимает оставшиеся аргументы массивом. Это модификаторы объявления, а не отдельные вызываемые команды.

Точный синтаксис

Function Sum(ParamArray values())
Sum()
Sum(2, 3, 4)
Sum(existingArray)

Параметры

  • name / As type — name / As type: Имя параметра и необязательное преобразование входного типа As. Аргументы передаются по позиции либо name:=value; модификаторы записываются в объявлении. См. Basic.NamedArguments.
  • ByRef — ByRef: изменяемая переменная или существующий элемент массива/коллекции. Без ByVal параметр этого движка также использует обратную запись; это отличается от значения по умолчанию в VB.NET. Литерал, константа или вычисленное выражение передаются как временное значение.
  • ByVal — ByVal: локальная копия значения. Присваивание параметру не меняет переменную вызывающего кода. Массивы и объекты при этом остаются общими ссылками, глубокой копии нет.
  • Optional / defaultValue — Optional / defaultValue: аргумент можно не передавать в конце вызова. Выражение после = вычисляется только при пропуске. Всегда указывайте понятное значение по умолчанию; без него пропущенный параметр получает неинициализированное Unit.
  • ParamArray — ParamArray values(): последний параметр собирает ноль или больше оставшихся значений. Один переданный массив используется напрямую; список скаляров упаковывается в новый массив. GetArrayLength возвращает его длину.

Возвращает

Модификаторы сами ничего не возвращают. RETURN задаёт результат функции отдельно. Запись через ByRef — изменение аргумента, а не возвращаемое значение; SUB без RETURN возвращает Unit. Числа в примерах — результаты расчёта, не признаки TRUE/FALSE.

Поведение

  • При вызове аргументы вычисляются слева направо один раз. Для индексированного ByRef сохраняются контейнер и индекс/ключ; изменение переменной контейнера другим аргументом не перенаправляет эту запись.
  • При входе создаются локальные параметры. При выходе, после внутренних FINALLY, значения ByRef записываются обратно по порядку параметров, включая выход из тела по ошибке. Передача одной переменной дважды не создаёт живой связи между двумя локальными параметрами: побеждает последняя обратная запись.
  • ByVal запрещает замену переменной вызывающего кода, но не изменение содержимого общего массива или объекта. ReDim локального ByVal-массива создаёт новую локальную ссылку. Для независимых данных нужна явная копия.
  • Для позиционных вызовов: Необязательные аргументы пропускаются с конца; пустые места между запятыми не поддерживаются. Значение по умолчанию может быть выражением нашего движка и исполняется при каждом пропуске. Оно не обязано быть константой VB.NET. Позиционные аргументы должны идти первыми; после первого именованного все остальные тоже именованные. Обязательные параметры пропускать нельзя. Пропущенные Optional в процедурах получают объявленные значения по умолчанию: они вычисляются по порядку объявления после переданных выражений. Нативные перегрузки принимают только зарегистрированные имена и количество аргументов, без придуманных значений по умолчанию.
  • ParamArray не записывает упакованные скаляры обратно в исходные переменные. Если передан готовый массив, изменение его элементов видно вызывающему коду. Повторная передача массива в другую ParamArray-функцию не создаёт лишний уровень вложенности.
  • Пишите ByRef и ByVal явно, чтобы читатель видел намерение. Эти правила относятся к вызовам пользовательских процедур из скрипта; параметры встроенных команд описываются в их собственных карточках.
  • ParamArray по имени передавать нельзя. При именованном вызове его можно оставить пустым; для передачи его элементов нужен полностью позиционный вызов. Пустые места между запятыми не поддерживаются. Это подмножество с правилом «позиционные сначала», без свободного смешивания из новых VB.NET. Новые потоки не создаются, игровые задержки не меняются.

Примеры

1. Пустой и непустой набор

# Sum() получает массив длины 0 и возвращает 0. Sum(2,3,4) получает три значения и возвращает 9. For Each проходит каждое значение. Main возвращает Integer 9.
Option Explicit On
Function Sum(ParamArray values())
    Var total = 0
    For Each value In values
        total += value
    Next
    Return total
End Function
Sub Main()
    Return Sum() + Sum(2, 3, 4)
End Sub

Разбор параметров и выполнения:

Sum() получает массив длины 0 и возвращает 0. Sum(2,3,4) получает три значения и возвращает 9. For Each проходит каждое значение. Main возвращает Integer 9.

2. Передача готового массива дальше

# values содержит 2 и 5. Forward получает готовый массив и передаёт его в Sum без дополнительной упаковки. Sum складывает два числа и возвращает Integer 7.
Option Explicit On
Function Sum(ParamArray values())
    Var total = 0
    For Each value In values
        total += value
    Next
    Return total
End Function
Function Forward(ParamArray values())
    Return Sum(values)
End Function
Sub Main()
    Dim values[1]
    values[0] = 2
    values[1] = 5
    Return Forward(values)
End Sub

Разбор параметров и выполнения:

values содержит 2 и 5. Forward получает готовый массив и передаёт его в Sum без дополнительной упаковки. Sum складывает два числа и возвращает Integer 7.

3. Скаляры и готовый массив

# SetFirst(first,second) меняет новый упакованный массив: first=2 и second=3 сохраняются. SetFirst(packed) меняет общий packed[0] с 4 на 9. Main возвращает 2*100+3*10+9, Integer 239.
Option Explicit On
Sub SetFirst(ParamArray values())
    If GetArrayLength(values) > 0 Then
        values[0] = 9
    End If
End Sub
Sub Main()
    Var first = 2
    Var second = 3
    SetFirst(first, second)
    Dim packed[0]
    packed[0] = 4
    SetFirst(packed)
    Return first * 100 + second * 10 + packed[0]
End Sub

Разбор параметров и выполнения:

SetFirst(first,second) меняет новый упакованный массив: first=2 и second=3 сохраняются. SetFirst(packed) меняет общий packed[0] с 4 на 9. Main возвращает 2100+310+9, Integer 239.


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

Basic

Clone this wiki locally