API Basic CompoundAssignment - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
+= / -= / *= / /= / &=
ClassicUO • Basic
Изменяйте существующую переменную или элемент массива через +=, -=, *=, /=. Движок читает текущее значение, выполняет операцию и записывает результат, не вычисляя цель дважды.
Точный синтаксис
target += value
target -= value
target *= value
target /= value
target &= value
Параметры
target— target: существующее скалярное имя либо элемент массива items[index], grid[x][y]. Элементы должны быть инициализированы, индексы допустимы и отсчитываются от нуля. Инструкция не объявляет переменную.operator— += и &= складывают числа или соединяют две String; -= вычитает; *= умножает; /= делит. Препроцессор заменяет &= на +=, поэтому 5 &= 3 сохраняет 8. Для String и числа нужен явный CStr. Оператор пишется единым токеном.value— value: выражение, однократно вычисляемое после цели и индексов. Его вид должен подходить операции. Перед добавлением числа к String преобразуйте его через CStr.
Возвращает
Нет значения (Unit). Это инструкция, а не выражение или флаг успеха. Чтобы получить сохранённый результат, прочитайте target следующей строкой. При записи скаляра действуют обычные правила AS: Integer 5 после /=2 хранит Integer 2, а нетипизированная числовая переменная получает Decimal 2.5.
Поведение
- Ссылка на каждый массив фиксируется до вычисления его индекса. Индексы однократно идут слева направо, границы проверяются до правого операнда. Выбранная ячейка остаётся целью, даже если функция ByRef в индексе или справа заменит переменную массива либо родительскую ячейку.
- Правила чисел и строк те же, что у +, -, *, /: целые переполняются в пределах знаковых 32 бит, / даёт Decimal и при делении на ноль возможны Infinity/NaN. Сложение String/числа ошибочно. У элементов массива нет скалярного преобразования AS.
- Необъявленная цель, неинициализированный элемент, неверный индекс, несовместимая операция, запись CONST или ошибка преобразования вызывают обрабатываемую ошибку. Итоговая запись не выполняется, но уже совершённые действия функций-операндов не откатываются. CONST и AS проверяются при записи скаляра, после возможного выполнения правой части.
- Option Explicit проверяет имена до запуска. Точки останова и наблюдение переменных используют исходную строку; циклы сохраняют проверки паузы и остановки. Последовательность чтения, расчёта и записи не является атомарной синхронизацией параллельных процедур.
Примеры
1. Все четыре операции
# amount начинается с 10. +=2 даёт 12, -=3 даёт 9, *=4 даёт 36, /=2 даёт Decimal 18. Main возвращает сохранённое значение; сами инструкции присваивания значения не возвращают.
Option Explicit On
SUB Main()
VAR amount = 10
amount += 2
amount -= 3
amount *= 4
amount /= 2
RETURN amount
END SUB
Разбор параметров и выполнения:
amount начинается с 10. +=2 даёт 12, -=3 даёт 9, *=4 даёт 36, /=2 даёт Decimal 18. Main возвращает сохранённое значение; сами инструкции присваивания значения не возвращают.
2. Индекс вычисляется один раз
# NextIndex увеличивает параметр calls, переданный ByRef, и возвращает индекс 0. items[0] начинается с 5; +=2 меняет его на 7. NextIndex вызывается один раз, поэтому calls=1. Main возвращает items[0]*10+calls=71. Вспомогательная функция приведена полностью.
Option Explicit On
FUNCTION NextIndex(ByRef calls)
calls += 1
RETURN 0
END FUNCTION
SUB Main()
DIM items[0]
items[0] = 5
VAR calls = 0
items[NextIndex(calls)] += 2
RETURN items[0] * 10 + calls
END SUB
Разбор параметров и выполнения:
NextIndex увеличивает параметр calls, переданный ByRef, и возвращает индекс 0. items[0] начинается с 5; +=2 меняет его на 7. NextIndex вызывается один раз, поэтому calls=1. Main возвращает items[0]*10+calls=71. Вспомогательная функция приведена полностью.
3. Обработать защиту константы
# limit объявлен как CONST 5. Попытка limit+=1 вызывает ошибку при записи; CATCH сохраняет её в problem и ставит caught=TRUE. limit остаётся 5. Main возвращает "5:1" с явными преобразованиями CStr. Флаг описывает обработку ошибки, а не возврат присваивания. Строка собирается в переменной: report=CStr(limit), затем report &= ":" и report &= CStr(caught). Каждое &= обновляет report; Return report возвращает "5:1".
Option Explicit On
SUB Main()
CONST limit = 5
VAR caught = FALSE
TRY
limit += 1
CATCH problem
caught = TRUE
END TRY
VAR report = CStr(limit)
report &= ":"
report &= CStr(caught)
RETURN report
END SUB
Разбор параметров и выполнения:
limit объявлен как CONST 5. Попытка limit+=1 вызывает ошибку при записи; CATCH сохраняет её в problem и ставит caught=TRUE. limit остаётся 5. Main возвращает "5:1" с явными преобразованиями CStr. Флаг описывает обработку ошибки, а не возврат присваивания. Строка собирается в переменной: report=CStr(limit), затем report &= ":" и report &= CStr(caught). Каждое &= обновляет report; Return report возвращает "5:1".