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.