Uma Tuple é bastante semelhante a um Vector (um array 1-D) em muitos aspetos.
No entanto, há algumas diferenças importantes.
( ) em vez de parênteses retos [ ], embora os parênteses possam ser omitidos nos casos em que o significado não é ambíguo.A imutabilidade permite mais otimizações do compilador e torna as tuplas mais eficientes do que os vetores, por isso devem ser preferidas nos casos em que a mutabilidade não é necessária.
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})
Existe também um construtor Tuple(), que transforma qualquer coleção iterável numa tupla.
Convenientemente, isto trata uma string como uma coleção iterável de carateres.
julia> Tuple("Julia")
('J', 'u', 'l', 'i', 'a')
Em qualquer tupla, é possível aceder aos elementos por índice ou iterar sobre eles.
Qualquer tupla puramente numérica também pode ser usada em funções matemáticas como sum(), exatamente como os arrays.
Uma tupla pode ser desempacotada em elementos individuais recorrendo a atribuição múltipla.
Para os elementos que não são necessários, usa o sublinhado _ como variável fictícia.
julia> tup = (1, "Julia", true)
(1, "Julia", true)
julia> num, name, _ = tup
(1, "Julia", true)
julia> uppercase(name), 2num
("JULIA", 2)
Quem programa em Python está muito familiarizado com esta sintaxe de atribuição múltipla.
Uma Tuple contém apenas valores.
Uma NamedTuple associa cada valor a um nome.
Os campos individuais podem depois ser acedidos com a notação de "ponto":
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
O nome é armazenado internamente como um Symbol (um tipo imutável, precedido de dois pontos :), por isso também existe uma sintaxe alternativa:
julia> nt[:b]
7.3
É fácil obter os nomes (também chamados "chaves") ou os valores separadamente:
julia> nt
(a = 1, b = 7.3)
julia> keys(nt)
(:a, :b)
julia> values(nt)
(1, 7.3)
Repara que a iteração sobre uma tupla nomeada produz apenas os valores, e os nomes são ignorados.
As tuplas (nomeadas ou não) são uma forma muito comum de transferir dados estruturados de e para funções. A imutabilidade é boa neste caso de uso, pois proporciona segurança dos dados e permite otimizações mais agressivas do compilador.
A Azara e o Rui são companheiros de equipa numa caça ao tesouro com tema pirata. Um tem uma lista de tesouros com coordenadas do mapa, o outro uma lista de nomes de locais com coordenadas do mapa. Também receberam mapas em branco com um ponto de partida marcado com ESTÁS AQUI.
| Lista da Azara | Lista do Rui | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Mas as coisas estão um pouco desorganizadas: as coordenadas da Azara parecem estar formatadas e ordenadas de forma diferente das do Rui, e têm de andar sempre a saltar de uma lista para a outra para descobrir que tesouros correspondem a que locais. Como aspirantes a programadores de Julia, vieram pedir-te ajuda para escrever um pequeno programa (um conjunto de funções, na verdade) que organize melhor a informação da caça ao tesouro.
Implementa a função get_cooordinate() que recebe um par (treasure, coordinate) da lista da Azara e devolve apenas a coordenada do mapa extraída.
julia> get_cooordinate( ("Scrimshaw Whale's Tooth", "2A") )
"2A"
Implementa a função convert_coordinate() que recebe uma coordenada no formato "2A" e devolve um tuplo no formato ('2', 'A').
julia> convert_coordinate("2A")
('2', 'A')
Implementa a função compare_records() que recebe um par (treasure, coordinate) e um registo (location, coordinate, quadrant) e compara as coordenadas de cada um.
Devolve true se as coordenadas "corresponderem" e devolve false se não corresponderem.
Reformata as coordenadas conforme for necessário para uma comparação exata.
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 a função create_record() que recebe um par (treasure, coordinate) da lista da Azara e um registo (location, coordinate, quadrant) da lista do Rui e devolve (coordinate, location, quadrant, treasure) se as coordenadas corresponderem.
Se as coordenadas não corresponderem, devolve um tuplo vazio. Reformata as coordenadas conforme for necessário para uma comparação exata.
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"))
()
Inscreve-te no Exercism para aprenderes e dominares Julia com 35 conceitos128 exercícios, e mentoria humana real, tudo grátis.