Una Tuple es bastante 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 en los casos en que el significado no sea ambiguo.La inmutabilidad permite más optimizaciones del compilador y hace que las tuplas rindan mejor que los vectores, así que conviene preferirlas cuando la mutabilidad no sea necesaria.
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 hay un constructor Tuple(), que convierte cualquier colección iterable en una tupla.
De forma útil, esto trata un string como una colección iterable de caracteres.
julia> Tuple("Julia")
('J', 'u', 'l', 'i', 'a')
Para cualquier tupla, es posible acceder a los elementos por índice o recorrerlos.
Cualquier tupla puramente numérica también se puede usar en funciones matemáticas como sum(), exactamente igual que los arrays.
Una tupla se puede desempaquetar en elementos individuales mediante asignación múltiple.
Para los elementos que no se necesiten, 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.
Un NamedTuple asocia cada valor con un nombre.
Los campos individuales se pueden consultar 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 los nombres (también llamados «claves») o los valores por separado:
julia> nt
(a = 1, b = 7.3)
julia> keys(nt)
(:a, :b)
julia> values(nt)
(1, 7.3)
Ten en cuenta que la iteración sobre una tupla con nombre solo produce los valores, y los nombres se ignoran.
Las tuplas (con nombre o no) son una forma muy común de transferir datos estructurados hacia y desde funciones. La inmutabilidad es buena en este caso de uso, ya que proporciona seguridad de 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 lugares con coordenadas del mapa. También les han dado mapas en blanco con un lugar de inicio marcado como «ESTÁS AQUÍ».
| Lista de Azara | Lista de Rui | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Pero las cosas están un poco desorganizadas: las coordenadas de Azara parecen estar formateadas y ordenadas de forma distinta a las de Rui, y tienen que ir mirando de una lista a otra para averiguar qué tesoros van con qué ubicaciones. Como programadores de Julia en ciernes, han acudido a ti para que les ayudes a escribir un pequeño programa (en realidad, un conjunto de funciones) para organizar mejor la información de su búsqueda.
Implementa la función get_cooordinate() que toma un par (treasure, coordinate) de la lista de Azara y devuelve solo la coordenada del mapa extraída.
julia> get_cooordinate( ("Scrimshaw Whale's Tooth", "2A") )
"2A"
Implementa la función convert_coordinate() que toma una coordenada en el formato "2A" y devuelve una tupla en el formato ('2', 'A').
julia> convert_coordinate("2A")
('2', 'A')
Implementa la función compare_records() que toma 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 lo hacen.
Reformatea las coordenadas según sea necesario para una comparación precisa.
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 toma 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. Reformatea las coordenadas según sea necesario para una comparación precisa.
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.