std.dict
Модуль операций со словарями (Dict(K, V)).
use std.dictСемантическая классификация
| Категория | Функции | Поведение |
|---|---|---|
| Только чтение (заимствование) | get has values keys entries len is_empty merge | Исходный словарь можно использовать многократно |
| Поглощает исходный словарь | set delete | Исходный словарь перемещается и больше не может быть использован |
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
set: (K: Type, V: Type)(dict: Dict(K, V), key: Any, value: Any) -> Dict(K, V)Возвращает новый словарь с записью key → value. dict передаётся по значению и перемещается после вызова.
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
get: (K: Type, V: Type)(dict: &Dict(K, V), key: Any) -> AnyПолучение значения по ключу (только для чтения, dict можно использовать повторно).
Возвращает: значение, соответствующее ключу. Ошибка: при отсутствии ключа выбрасывается E6008 (ключ отсутствует). Перед получением значения можно выполнить проверку с помощью has.
use std.assert
use std.dict
main: () -> Void = {
d = dict.set(dict.new(), "a", 1)
assert(dict.get(d, "a") == 1)
}Проверка существования перед получением:
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
has: (K: Type, V: Type)(dict: &Dict(K, V), key: Any) -> BoolПроверяет, существует ли key в словаре.
Ошибка: если первый аргумент не является словарём, выбрасывается E6007.
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
delete: (K: Type, V: Type)(dict: Dict(K, V), key: Any) -> Dict(K, V)Возвращает новый словарь после удаления key. dict передаётся по значению и перемещается после вызова.
Возвращает: новый словарь. Удаление несуществующего ключа не вызывает ошибку — словарь остаётся без изменений.
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
keys: (A: Type, B: Type, C: Type)(dict: &Dict(A, B)) -> Vec(C)Возвращает список всех ключей (только для чтения).
Порядок возврата зависит от реализации хэширования и не гарантируется стабильным. Если требуется упорядоченный вывод, выполните сортировку самостоятельно.
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
values: (A: Type, B: Type, C: Type)(dict: &Dict(A, B)) -> Vec(C)Возвращает список всех значений (только для чтения). Порядок не гарантируется стабильным.
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
entries: (A: Type, B: Type, C: Type)(dict: &Dict(A, B)) -> Vec(C)Возвращает список пар ключ-значение, каждый элемент — кортеж (key, value). Порядок не гарантируется стабильным.
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
len: (K: Type, V: Type)(dict: &Dict(K, V)) -> IntКоличество элементов. Только для чтения, dict можно использовать многократно.
Ошибка: если аргумент не является словарём, выбрасывается E6007.
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
is_empty: (K: Type, V: Type)(dict: &Dict(K, V)) -> BoolПроверяет, пуст ли словарь.
Ошибка: если аргумент не является словарём, выбрасывается E6007.
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
merge: (A: Type, B: Type)(a: &Dict(A, B), b: &Dict(A, B)) -> Dict(A, B)Сливает два словаря и возвращает новый словарь. Оба исходных словаря передаются только для чтения и не изменяются.
При конфликте ключей значение из b перезаписывает значение из a.
Ошибка: если любой из аргументов не является словарём, выбрасывается E6007.
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)
}Связанные материалы
std.list— для обработки возвращаемых значенийkeys/values/entries- Справочник по кодам ошибок —
E6008ключ отсутствует
