NamedTuple
#
Core.NamedTuple
— Type
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
.
При итерации по |
ниже.) Для итерации по парам «имя-значение» используйте функцию 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 методы |