Документация Engee

NamedTuple

NamedTuple

NamedTuple, как следует из названия, — это именованный кортеж (Tuple). То есть это подобная кортежу коллекция значений, каждый элемент которой имеет уникальное имя, представленное Symbol. Как и тип Tuple, тип NamedTuple является неизменяемым: ни имена, ни значения нельзя изменить напрямую после создания.

Именованный кортеж можно создать как литерал кортежа с ключами, например (a=1, b=2), как литерал кортежа с точкой с запятой после открывающей скобки, например (; a=1, b=2) (эта форма также принимает программно сгенерированные имена, как описано ниже), или с использованием типа NamedTuple в качестве конструктора, например NamedTuple{(:a, :b)}1,2.

Получить доступ к значению, связанному с именем, в именованном кортеже можно с помощью синтаксиса доступа к полям, например x.a, или с помощью функции getindex, например x[:a] или x[(:a, :b)]. Кортеж имен можно получить с помощью функции keys, а кортеж значений — с помощью функции values.

При итерации по NamedTuple возвращаются значения без имен. (См. пример

ниже.) Для итерации по парам «имя-значение» используйте функцию pairs.

Объявлять типы NamedTuple удобно с помощью макроса @NamedTuple.

Примеры

julia> x = (a=1, b=2)
(a = 1, b = 2)

julia> x.a
1

julia> x[:a]
1

julia> x[(:a,)]
(a = 1,)

julia> keys(x)
(:a, :b)

julia> values(x)
(1, 2)

julia> collect(x)
2-element Vector{Int64}:
 1
 2

julia> collect(pairs(x))
2-element Vector{Pair{Symbol, Int64}}:
 :a => 1
 :b => 2

Так же как и в случае с программным определением именованных аргументов, именованный кортеж можно создать путем указания пар name::Symbol => value после точки с запятой внутри литерала кортежа. Этот вариант и синтаксис name=value можно сочетать:

julia> (; :a => 1, :b => 2, c=3)
(a = 1, b = 2, c = 3)

Пары «имя-значение» также можно предоставить путем распаковки именованного кортежа или любого итератора, выдающего коллекции из двух значений, первым из которых является символ:

julia> keys = (:a, :b, :c); values = (1, 2, 3);

julia> NamedTuple{keys}(values)
(a = 1, b = 2, c = 3)

julia> (; (keys .=> values)...)
(a = 1, b = 2, c = 3)

julia> nt1 = (a=1, b=2);

julia> nt2 = (c=3, d=4);

julia> (; nt1..., nt2..., b=20) # последнее b перезаписывает значение из nt1
(a = 1, b = 20, c = 3, d = 4)

julia> (; zip(keys, values)...) # zip выдает кортежи типа (:a, 1)
(a = 1, b = 2, c = 3)

Как и в случае с именованными аргументами, идентификаторы и точечные выражения предполагают использование имен:

julia> x = 0
0

julia> t = (; x)
(x = 0,)

julia> (; t.x)
(x = 0,)
Совместимость: Julia 1.5

Начиная с версии Julia 1.5 для идентификаторов и точечных выражений доступны неявные имена.

Совместимость: Julia 1.7

Начиная с версии Julia 1.7 методы getindex могут использоваться с несколькими символами (Symbol).