Skip to content

std.dict ​

Модуль операций со словарями (Dict(K, V)).

yaoxiang
use std.dict

Семантическая классификация ​

КатегорияФункцииПоведение
Только чтение (заимствование)get has values keys entries len is_empty mergeИсходный словарь можно использовать многократно
Поглощает исходный словарьset deleteИсходный словарь перемещается и больше не может быть использован
yaoxiang
use std.assert
use std.dict

main: () -> Void = {
    d = dict.set(dict.new(), "a", 1)

    // Только чтение: d можно использовать многократно
    assert(dict.get(d, "a") == 1)
    assert(dict.len(d) == 1)
    assert(dict.has(d, "a"))
}

Список функций ​

ФункцияСигнатура
get(K: Type, V: Type)(dict: &Dict(K, V), key: Any) -> Any
set(K: Type, V: Type)(dict: Dict(K, V), key: Any, value: Any) -> Dict(K, V)
has(K: Type, V: Type)(dict: &Dict(K, V), key: Any) -> Bool
values(A: Type, B: Type, C: Type)(dict: &Dict(A, B)) -> Vec(C)
keys(A: Type, B: Type, C: Type)(dict: &Dict(A, B)) -> Vec(C)
entries(A: Type, B: Type, C: Type)(dict: &Dict(A, B)) -> Vec(C)
delete(K: Type, V: Type)(dict: Dict(K, V), key: Any) -> Dict(K, V)
len(K: Type, V: Type)(dict: &Dict(K, V)) -> Int
is_empty(K: Type, V: Type)(dict: &Dict(K, V)) -> Bool
merge(A: Type, B: Type)(a: &Dict(A, B), b: &Dict(A, B)) -> Dict(A, B)
new(K: Type, V: Type)() -> Dict(K, V)
## Функции

set ​

yaoxiang
set: (K: Type, V: Type)(dict: Dict(K, V), key: Any, value: Any) -> Dict(K, V)

Возвращает новый словарь с записью key → value. dict передаётся по значению и перемещается после вызова.

yaoxiang
use std.assert
use std.dict

main: () -> Void = {
    d1 = dict.set(dict.new(), "a", 1)
    d2 = dict.set(d1, "b", 2)
    assert(dict.len(d2) == 2)
}

get ​

yaoxiang
get: (K: Type, V: Type)(dict: &Dict(K, V), key: Any) -> Any

Получение значения по ключу (только для чтения, dict можно использовать повторно).

Возвращает: значение, соответствующее ключу. Ошибка: при отсутствии ключа выбрасывается E6008 (ключ отсутствует). Перед получением значения можно выполнить проверку с помощью has.

yaoxiang
use std.assert
use std.dict

main: () -> Void = {
    d = dict.set(dict.new(), "a", 1)
    assert(dict.get(d, "a") == 1)
}

Проверка существования перед получением:

yaoxiang
use std.assert
use std.dict

main: () -> Void = {
    d = dict.set(dict.new(), "a", 1)
    assert(!dict.has(d, "nope"))
    if dict.has(d, "a") {
        assert(dict.get(d, "a") == 1)
    }
}

has ​

yaoxiang
has: (K: Type, V: Type)(dict: &Dict(K, V), key: Any) -> Bool

Проверяет, существует ли key в словаре.

Ошибка: если первый аргумент не является словарём, выбрасывается E6007.

yaoxiang
use std.assert
use std.dict

main: () -> Void = {
    d = dict.set(dict.new(), "a", 1)
    assert(dict.has(d, "a"))
    assert(!dict.has(d, "zzz"))
}

delete ​

yaoxiang
delete: (K: Type, V: Type)(dict: Dict(K, V), key: Any) -> Dict(K, V)

Возвращает новый словарь после удаления key. dict передаётся по значению и перемещается после вызова.

Возвращает: новый словарь. Удаление несуществующего ключа не вызывает ошибку — словарь остаётся без изменений.

yaoxiang
use std.assert
use std.dict

main: () -> Void = {
    d = dict.set(dict.new(), "a", 1)
    deleted = dict.delete(d, "a")
    assert(!dict.has(deleted, "a"))
}

keys ​

yaoxiang
keys: (A: Type, B: Type, C: Type)(dict: &Dict(A, B)) -> Vec(C)

Возвращает список всех ключей (только для чтения).

Порядок возврата зависит от реализации хэширования и не гарантируется стабильным. Если требуется упорядоченный вывод, выполните сортировку самостоятельно.

yaoxiang
use std.assert
use std.dict
use std.list

main: () -> Void = {
    d = dict.set(dict.new(), "a", 1)
    ks = dict.keys(d)
    assert(list.len(ks) == 1)
}

values ​

yaoxiang
values: (A: Type, B: Type, C: Type)(dict: &Dict(A, B)) -> Vec(C)

Возвращает список всех значений (только для чтения). Порядок не гарантируется стабильным.

yaoxiang
use std.assert
use std.dict
use std.list

main: () -> Void = {
    d = dict.set(dict.new(), "a", 1)
    vs = dict.values(d)
    assert(list.len(vs) == 1)
}

entries ​

yaoxiang
entries: (A: Type, B: Type, C: Type)(dict: &Dict(A, B)) -> Vec(C)

Возвращает список пар ключ-значение, каждый элемент — кортеж (key, value). Порядок не гарантируется стабильным.

yaoxiang
use std.assert
use std.dict
use std.list

main: () -> Void = {
    d = dict.set(dict.new(), "a", 1)
    es = dict.entries(d)
    assert(list.len(es) == 1)
}

len ​

yaoxiang
len: (K: Type, V: Type)(dict: &Dict(K, V)) -> Int

Количество элементов. Только для чтения, dict можно использовать многократно.

Ошибка: если аргумент не является словарём, выбрасывается E6007.

yaoxiang
use std.assert
use std.dict

main: () -> Void = {
    d = dict.set(dict.new(), "a", 1)
    assert(dict.len(d) == 1)
    assert(dict.len(d) == 1)      // можно использовать повторно
}

is_empty ​

yaoxiang
is_empty: (K: Type, V: Type)(dict: &Dict(K, V)) -> Bool

Проверяет, пуст ли словарь.

Ошибка: если аргумент не является словарём, выбрасывается E6007.

yaoxiang
use std.assert
use std.dict

main: () -> Void = {
    assert(dict.is_empty(dict.new()))
    d = dict.set(dict.new(), "a", 1)
    assert(!dict.is_empty(d))
}

merge ​

yaoxiang
merge: (A: Type, B: Type)(a: &Dict(A, B), b: &Dict(A, B)) -> Dict(A, B)

Сливает два словаря и возвращает новый словарь. Оба исходных словаря передаются только для чтения и не изменяются.

При конфликте ключей значение из b перезаписывает значение из a.

Ошибка: если любой из аргументов не является словарём, выбрасывается E6007.

yaoxiang
use std.assert
use std.dict

main: () -> Void = {
    m = dict.merge(dict.set(dict.new(), "x", 10), dict.set(dict.new(), "y", 20))
    assert(dict.get(m, "x") == 10)
    assert(dict.get(m, "y") == 20)
}

Связанные материалы ​