Una Tuple es muy similar a un Vector (un array unidimensional) en muchos aspectos.
Sin embargo, hay algunas diferencias importantes.
( ) en lugar de corchetes [ ], aunque los paréntesis se pueden omitir cuando el significado no es ambiguo.La inmutabilidad permite más optimizaciones del compilador y hace que las tuplas tengan mejor rendimiento que los vectores, así que conviene preferirlas cuando no se necesita mutabilidad.
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})
También existe un constructor Tuple(), que convierte cualquier colección iterable en una tupla.
Algo muy útil: trata un string como una colección iterable de caracteres.
julia> Tuple("Julia")
('J', 'u', 'l', 'i', 'a')
En cualquier tupla es posible acceder a los elementos por índice o recorrerlos con un bucle.
Cualquier tupla puramente numérica también se puede usar en funciones matemáticas como sum(), igual que los arrays.
Una tupla se puede desempaquetar en elementos individuales usando asignación múltiple.
Para los elementos que no necesitas, usa el guion bajo _ como variable ficticia.
julia> tup = (1, "Julia", true)
(1, "Julia", true)
julia> num, name, _ = tup
(1, "Julia", true)
julia> uppercase(name), 2num
("JULIA", 2)
Quienes programan en Python estarán muy familiarizados con esta sintaxis de asignación múltiple.
Una Tuple solo contiene valores.
Una NamedTuple asocia cada valor con un nombre.
Cada campo se puede acceder luego con la notación de «punto»:
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
El nombre se almacena internamente como un Symbol (un tipo inmutable, precedido por dos puntos :), así que hay una sintaxis alternativa disponible:
julia> nt[:b]
7.3
Es fácil obtener por separado los nombres (también llamados «claves») o los valores:
julia> nt
(a = 1, b = 7.3)
julia> keys(nt)
(:a, :b)
julia> values(nt)
(1, 7.3)
Ten en cuenta que al iterar sobre una tupla con nombre solo se producen los valores, y los nombres se ignoran.
Las tuplas (con nombre o no) son una forma muy común de transferir datos estructurados desde y hacia las funciones. La inmutabilidad viene muy bien en este caso: aporta seguridad a los datos y permite optimizaciones del compilador más agresivas.
Azara y Rui son compañeros de equipo que compiten en una búsqueda del tesoro con temática pirata. Uno tiene una lista de tesoros con coordenadas del mapa y el otro una lista de nombres de ubicaciones con coordenadas del mapa. También les dieron mapas en blanco con un punto de partida marcado como AQUÍ ESTÁS.
| Lista de Azara | Lista de Rui | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Pero las cosas están un poco desorganizadas: las coordenadas de Azara parecen estar formateadas y ordenadas de manera distinta a las de Rui, y tienen que ir mirando de una lista a la otra para descubrir qué tesoros van con qué ubicaciones. Como son programadores de Julia en ciernes, acudieron a ti para que les ayudes a escribir un pequeño programa (en realidad, un conjunto de funciones) que organice mejor la información de su búsqueda.
Implementa la función get_cooordinate() que recibe un par (treasure, coordinate) de la lista de Azara y devuelve únicamente la coordenada del mapa extraída.
julia> get_cooordinate( ("Scrimshaw Whale's Tooth", "2A") )
"2A"
Implementa la función convert_coordinate() que recibe una coordenada con el formato «2A» y devuelve una tupla con el formato ('2', 'A').
julia> convert_coordinate("2A")
('2', 'A')
Implementa la función compare_records() que recibe un par (treasure, coordinate) y un registro (location, coordinate, quadrant) y compara las coordenadas de cada uno.
Devuelve true si las coordenadas «coinciden» y devuelve false si no.
Vuelve a formatear las coordenadas como sea necesario para compararlas con exactitud.
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
Implementa la función create_record() que recibe un par (treasure, coordinate) de la lista de Azara y un registro (location, coordinate, quadrant) de la lista de Rui, y devuelve (coordinate, location, quadrant, treasure) si las coordenadas coinciden.
Si las coordenadas no coinciden, devuelve una tupla vacía. Vuelve a formatear las coordenadas como sea necesario para compararlas con exactitud.
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"))
()
Regístrate en Exercism para aprender y dominar Julia con 35 conceptos128 ejercicios y mentoría humana real, todo gratis.