Tuple багато в чому досить схожий на Vector (одновимірний array).
Однак є кілька важливих відмінностей.
( ), а не в квадратних [ ], хоча круглі дужки можна опускати, коли зміст однозначний.Незмінність дозволяє компілятору краще оптимізувати код і робить кортежі продуктивнішими за вектори, тому їм варто віддавати перевагу там, де змінність не потрібна.
julia> t = (3, 5.2, "xyz")
(3, 5.2, "xyz")
# Non-homogeneous:
julia> dump(t)
Tuple{Int64, Float64, String}
1: Int64 3
2: Float64 5.2
3: String "xyz"
julia> t[2]
5.2
# Immutable:
julia> t[2] = 7.3
ERROR: MethodError: no method matching setindex!(::Tuple{Int64, Float64, String})
Також є конструктор Tuple(), який перетворює будь-яку колекцію, яку можна перебрати, на кортеж.
Зручно, що він розглядає рядок тексту (англ. string) як колекцію символів, яку можна перебрати.
julia> Tuple("Julia")
('J', 'u', 'l', 'i', 'a')
Для будь-якого кортежу можна отримати доступ до елементів за індексом або перебрати їх.
Будь-який суто числовий кортеж також можна використати в математичних функціях, як-от sum(), точнісінько як масиви.
Кортеж можна розпакувати на окремі елементи за допомогою множинного присвоєння.
Для елементів, які не потрібні, використаймо підкреслення _ як змінну-заглушку.
julia> tup = (1, "Julia", true)
(1, "Julia", true)
julia> num, name, _ = tup
(1, "Julia", true)
julia> uppercase(name), 2num
("JULIA", 2)
Програмістам Python синтаксис множинного присвоєння добре знайомий.
Tuple містить лише значення.
NamedTuple поєднує кожне значення з іменем.
До окремих полів тоді можна отримати доступ через «крапкову» нотацію:
julia> nt = (a = 1, b = 7.3)
(a = 1, b = 7.3)
julia> dump(nt)
@NamedTuple{a::Int64, b::Float64}
a: Int64 1
b: Float64 7.3
julia> nt.b
7.3
Імʼя всередині зберігається як Symbol (незмінний тип, перед яким ставиться двокрапка :), тому доступний альтернативний синтаксис:
julia> nt[:b]
7.3
Легко отримати окремо або імена (їх також називають ключами), або значення:
julia> nt
(a = 1, b = 7.3)
julia> keys(nt)
(:a, :b)
julia> values(nt)
(1, 7.3)
Зауважмо, що ітерація за іменованим кортежем дає лише значення, а імена ігноруються.
Кортежі (іменовані чи ні) дуже часто використовують, щоб передавати структуровані дані у функції та з функцій. Незмінність у такому застосуванні корисна: вона забезпечує безпеку даних і дозволяє компілятору агресивніше оптимізувати код.
Азара та Руї - напарники, які змагаються в пошуку скарбів на піратську тему. В одного з них є список скарбів із координатами на карті, а в другого - список назв місць із координатами на карті. Також їм дали порожні карти, на яких місце старту позначено як «ВИ ТУТ».
| Список Азари | Список Руї | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Але дещо тут переплутано: координати Азари, схоже, записані та відсортовані не так, як у Руї, тож їм доводиться раз у раз переглядати один список за одним, щоб зрозуміти, які скарби відповідають яким місцям. Як програмісти-початківці на Julia, вони звернулися до нас по допомогу з написанням невеликої програми (насправді набору функцій), щоб краще впорядкувати інформацію про свої пошуки.
Реалізуйте функцію get_cooordinate(), яка приймає пару (treasure, coordinate) зі списку Азари й повертає лише витягнуту координату на карті.
julia> get_cooordinate( ("Scrimshaw Whale's Tooth", "2A") )
"2A"
Реалізуйте функцію convert_coordinate(), яка приймає координату у форматі «2A» і повертає кортеж у форматі ('2', 'A').
julia> convert_coordinate("2A")
('2', 'A')
Реалізуйте функцію compare_records(), яка приймає пару (treasure, coordinate) та запис (location, coordinate, quadrant) і порівнює координати з кожного з них.
Поверніть true, якщо координати «збігаються», і false, якщо ні.
За потреби переформатуйте координати, щоб порівняння було точним.
julia> compare_records(("Brass Spyglass", "4B"), ("Seaside Cottages", ('1', 'C'), "blue"))
false
julia> compare_records(("Model Ship in Large Bottle", "8A"), ("Harbor Managers Office", ('8', 'A'), "purple"))
true
Реалізуйте функцію create_record(), яка приймає пару (treasure, coordinate) зі списку Азари та запис (location, coordinate, quadrant) зі списку Руї й повертає (coordinate, location, quadrant, treasure), якщо координати збігаються.
Якщо координати не збігаються, поверніть порожній кортеж. За потреби переформатуйте координати, щоб порівняння було точним.
julia> create_record(("Brass Spyglass", "4B"), ("Abandoned Lighthouse", ('4', 'B'), "Blue"))
("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")
julia> create_record(("Brass Spyglass", "4B"), ("Seaside Cottages", ('1', 'C'), "Blue"))
()
Зареєструйтеся на Exercism, щоб вивчати й опановувати Julia, а також 35 концепцій128 вправ та справжнє наставництво від людей, і все це безкоштовно.