API Dictionary - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
Dictionary
ClassicUO • Runtime API
Dictionary() создаёт словарь ключ → значение. Методы вызываются у полученного объекта. Числовые и текстовые ключи различаются; "ore" и "Ore" — разные ключи.
Точный синтаксис
Dictionary() -> Object
Dictionary(source:Any) -> Object
Выберите одну из зарегистрированных форм. Параметры передаются позиционно. Any означает значение BASIC с преобразованием внутри команды; Unit — отсутствие возвращаемого значения.
Параметры
source— source: без аргумента создаётся пустая коллекция. List принимает массив или List; Dictionary — другой Dictionary. Копируется внешний контейнер, вложенные объекты и массивы остаются общими ссылками.
Возвращает
Конструктор возвращает Object:Dictionary. Item, чтение индекса и Get возвращают значение; Count — количество ключей. ContainsKey/Remove возвращают 1=TRUE или 0=FALSE. Add/Set/Clear возвращают Unit; Keys/Values — новые Array. For Each выдаёт записи: Key() возвращает ключ, Value() — значение.
Поведение
- index / key: позиция List — целое числовое значение от 0; Insert допускает также Count(). Ключ Dictionary — текст или конечное число. Числовые 1 и 1.0 — один ключ, строка "1" — другой.
- value: инициализированное значение Basic, включая массивы и вложенные коллекции. Unit хранить нельзя. Сравниваются числовые значения, текст с учётом регистра либо идентичность ссылок массивов/объектов.
- fallback: Get возвращает это значение при отсутствии ключа, не добавляя его. Все аргументы, включая выражение fallback, вычисляются до вызова метода.
- Add не перезаписывает существующий ключ, а выдаёт ошибку. Set и запись по ключу добавляют или заменяют значение. Item/индекс требуют наличия ключа, Get допускает запасное значение. Remove возвращает 0, если ключа нет; Clear очищает словарь.
- NaN, бесконечность, массивы, объекты и Unit не допускаются как ключи. Порядок ключей не гарантируется. Каждая запись перебора сохраняет собственную пару; сохранённая запись не меняется на следующей итерации.
- Keys/Values возвращают поверхностные копии. Для удаления/замены при переборе используйте Keys(); For Each по самому словарю выдаёт объекты записей.
- Изменение коллекции во время непосредственного For Each, включая Set, вызывает перехватываемую ошибку на следующем шаге. Try/Finally выполняет выход корректно. Неудачное изменение сохраняет прежние данные.
- Псевдонимы и аргументы ByVal используют общую коллекцию. Конструктор копии и снимки копируют только внешний контейнер. Индексированный ByRef и составное присваивание вычисляют контейнер/ключ один раз; замена переменной не перенаправляет запись.
- Это локальные данные скрипта: методы не переносят предметы в игре и не обращаются к сети. Стопка, сохранённая одним элементом, занимает одну позицию списка.
Примеры
Пример 1. Тип ключа и запасное значение
# Тип ключа и запасное значение
#
# Dictionary() создаёт словарь ключ → значение. Методы вызываются у полученного объекта.
# Числовые и текстовые ключи различаются; "ore" и "Ore" — разные ключи.
#
# Конструктор возвращает Object:Dictionary. Item, чтение индекса и Get возвращают значение;
# Count — количество ключей. ContainsKey/Remove возвращают 1=TRUE или 0=FALSE. Add/Set/Clear
# возвращают Unit; Keys/Values — новые Array. For Each выдаёт записи: Key() возвращает ключ,
# Value() — значение.
Option Explicit On
Sub Main()
# "ore" меняется с 5 на 8. Числовой ключ 1 хранит 2, текстовый "1" — 3. Get("wood",7) возвращает
# 7 без добавления ключа. Main возвращает 8*100+2*10+3+7, Integer 830.
Var values = Dictionary()
values.Add("ore", 5)
values.Set("ore", 8)
values[1] = 2
values["1"] = 3
Return values.Item("ore")*100 + values[1]*10 + values["1"] + values.Get("wood", 7)
End Sub
Разбор параметров и выполнения:
- "ore" меняется с 5 на 8. Числовой ключ 1 хранит 2, текстовый "1" — 3. Get("wood",7) возвращает 7 без добавления ключа. Main возвращает 8100+210+3+7, Integer 830.
Пример 2. Записи, снимки и удаление
# Записи, снимки и удаление
#
# Dictionary() создаёт словарь ключ → значение. Методы вызываются у полученного объекта.
# Числовые и текстовые ключи различаются; "ore" и "Ore" — разные ключи.
#
# Конструктор возвращает Object:Dictionary. Item, чтение индекса и Get возвращают значение;
# Count — количество ключей. ContainsKey/Remove возвращают 1=TRUE или 0=FALSE. Add/Set/Clear
# возвращают Unit; Keys/Values — новые Array. For Each выдаёт записи: Key() возвращает ключ,
# Value() — значение.
Option Explicit On
Sub Main()
# Значения двух записей дают сумму 5. Снимок Keys() позволяет удалять при переборе. copied
# сохраняет ore=2, snapshot — два значения. После Clear Count()=0. Main возвращает
# 5*100+2*10+2+0, Integer 522.
Var values = Dictionary()
values.Add("ore", 2)
values.Add("wood", 3)
Var copied = Dictionary(values)
Var snapshot = values.Values()
Var total = 0
For Each entry In values
If values.ContainsKey(entry.Key()) Then
total += entry.Value()
End If
Next
For Each key In values.Keys()
values.Remove(key)
Next
values.Clear()
Return total*100 + copied["ore"]*10 + GetArrayLength(snapshot) + values.Count()
End Sub
Разбор параметров и выполнения:
- Значения двух записей дают сумму 5. Снимок Keys() позволяет удалять при переборе. copied сохраняет ore=2, snapshot — два значения. После Clear Count()=0. Main возвращает 5100+210+2+0, Integer 522.
Пример 3. Повторный ключ и обработка ошибки
# Повторный ключ и обработка ошибки
#
# Dictionary() создаёт словарь ключ → значение. Методы вызываются у полученного объекта.
# Числовые и текстовые ключи различаются; "ore" и "Ore" — разные ключи.
#
# Конструктор возвращает Object:Dictionary. Item, чтение индекса и Get возвращают значение;
# Count — количество ключей. ContainsKey/Remove возвращают 1=TRUE или 0=FALSE. Add/Set/Clear
# возвращают Unit; Keys/Values — новые Array. For Each выдаёт записи: Key() возвращает ключ,
# Value() — значение.
Option Explicit On
Sub Main()
# Первый Add сохраняет ore=4. Второй Add со значением 7 вызывает ошибку; Catch устанавливает
# caught=1. Исходное ore=4 сохраняется. Main возвращает 4*10+1, Integer 41.
Var values = Dictionary()
values.Add("ore", 4)
Var caught = 0
Try
values.Add("ore", 7)
Catch problem
caught = 1
End Try
Return values["ore"]*10 + caught
End Sub
Разбор параметров и выполнения:
- Первый Add сохраняет ore=4. Второй Add со значением 7 вызывает ошибку; Catch устанавливает caught=1. Исходное ore=4 сохраняется. Main возвращает 4*10+1, Integer 41.