API Basic Types - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
AS
ClassicUO • Basic
AS задаёт правило преобразования скалярной переменной. В движке хранятся Integer, Decimal, String, Array, Object и Unit — отсутствие значения. Boolean хранится как Integer 1/0. У этого диалекта Basic собственные правила: имя типа не означает соответствующую разрядность VB.NET.
Точный синтаксис
VAR name AS type [= value]
DIM name AS type [= value]
Параметры
name— Имя объявляемой переменной. Чтение даёт её текущее значение; при каждом следующем присваивании снова применяется преобразование AS.type— Integer, Long, Short, Byte: знаковое 32-битное целое от -2147483648 до 2147483647; Short и Byte не вводят более узкие пределы. Double, Single, Decimal: двоичное 64-битное число с плавающей точкой, внутреннее имя Decimal; это не точная десятичная арифметика. String: текст. Boolean, Bool: Integer 1/0. Variant, Object: сохраняют вид переданного значения, не требуя экземпляра объекта. Регистр имени не важен.value— Необязательное начальное значение: число, текст, переменная или результат функции. AS относится к объявлению; для явного преобразования в выражении используются CInt(value), CDbl(value), CStr(value), CBool(value).
Возвращает
Сам AS ничего не возвращает. Чтение переменной возвращает сохранённый вид и значение. Логический числовой результат использует TRUE=1 и FALSE=0. Количество 2 не равно нулю, но 2=TRUE ложно: наличие предметов проверяйте через count<>0 или CBool(count).
Поведение
- Без инициализатора типизированный VAR даёт 0 для целых/Boolean, дробный 0 для Double/Single/Decimal и пустой текст для String. VAR без типа и VAR AS Variant/Object дают Unit. Скалярный DIM подставляет инициализатор: пустой текст для String, иначе 0. Unit при присваивании через AS остаётся Unit.
- AS Integer отбрасывает дробную часть допустимого по диапазону числа к нулю. CInt/CLng округляют, а половины — от нуля: 2.6 превращается в 3, тогда как AS Integer сохраняет 2. Целочисленный текст должен целиком содержать десятичное целое или 0x-число; "2.6" не подходит. Проверяйте диапазон до преобразования.
- AS Boolean сравнивает исходное значение с числовым нулём: ненулевое число даёт 1, ноль — 0. Слова не распознаются: даже текст "false" превращается в 1. CBool сначала выполняет числовое преобразование. Используйте числа/логические значения либо явно сравнивайте текст с нужным словом.
- AS String использует текстовое представление движка. AS Double/Single/Decimal разбирает числовой текст с точкой. Числовое AS превращает Array в 0, но для Object и неверного числового текста выдаёт ошибку, обрабатываемую TRY/CATCH. CInt/CLng/CDbl/CSng/CBool используют более мягкое чтение: непонятная строка, Array, Object или Unit сначала превращаются в 0. Проверяйте IsNumeric(value), прежде чем полагаться на преобразование текста.
- Движок вычисляет инициализатор, выбирает преобразование AS и сохраняет результат с именем типа. Следующее присваивание повторяет преобразование. Дробные значения приблизительные; не рассчитывайте на точную денежную десятичную арифметику. Области видимости описаны в VAR / DIM, защита привязки — в CONST.
- После As также поддерживается имя объявленной Structure. VAR и DIM с этим типом без инициализатора создают поля по умолчанию. Принимается именно этот объявленный тип структуры; разные структурные типы друг в друга не преобразуются. Копирование вложенных значений и ссылочные поля описаны в Structure / New.
Примеры
1. Присваивание и округление
# source=2.6 — дробное число. whole AS Integer сохраняет 2; CInt(source) возвращает 3 в rounded. Main возвращает 2*10+3=23, чтобы можно было проверить сразу оба преобразования.
Option Explicit On
SUB Main()
VAR source = 2.6
VAR whole AS Integer = source
VAR rounded = CInt(source)
RETURN whole * 10 + rounded
END SUB
Разбор параметров и выполнения:
source=2.6 — дробное число. whole AS Integer сохраняет 2; CInt(source) возвращает 3 в rounded. Main возвращает 2*10+3=23, чтобы можно было проверить сразу оба преобразования.
2. Количество и логический результат
# count=2 — количество предметов. hasItems AS Boolean становится 1. count=TRUE ложно, потому что TRUE равен именно 1; count<>0 истинно. Main возвращает hasItems=1: предметы есть, но это не означает количество один.
Option Explicit On
SUB Main()
VAR count = 2
VAR hasItems AS Boolean = count
IF count = TRUE THEN
RETURN -1
END IF
IF count <> 0 THEN
RETURN hasItems
END IF
RETURN FALSE
END SUB
Разбор параметров и выполнения:
count=2 — количество предметов. hasItems AS Boolean становится 1. count=TRUE ложно, потому что TRUE равен именно 1; count<>0 истинно. Main возвращает hasItems=1: предметы есть, но это не означает количество один.
3. Variant сохраняет вид значения
# value AS Variant сначала хранит Integer 7, затем String "ore". text AS String начинается с пустой строки. CStr(12) даёт текст "12"; соединение двух строк даёт "ore12", которое возвращает Main. Variant допускает смену вида значения.
Option Explicit On
SUB Main()
VAR value AS Variant = 7
value = "ore"
VAR text AS String
text = value + CStr(12)
RETURN text
END SUB
Разбор параметров и выполнения:
value AS Variant сначала хранит Integer 7, затем String "ore". text AS String начинается с пустой строки. CStr(12) даёт текст "12"; соединение двух строк даёт "ore12", которое возвращает Main. Variant допускает смену вида значения.