Um Tuple é bastante parecido com um Vector (um array unidimensional) em muitos aspectos. No entanto, há algumas diferenças importantes.
( ) em vez de colchetes [ ], embora os parênteses possam ser omitidos quando o significado não é ambíguo.A imutabilidade permite mais otimizações do compilador e torna as tuplas mais eficientes que os vetores, então elas devem ser preferidas quando 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})
Também existe um construtor Tuple(), que transforma qualquer coleção iterável em uma tupla. De forma útil, ele trata uma string como uma coleção iterável de caracteres.
julia> Tuple("Julia")
('J', 'u', 'l', 'i', 'a')
Para qualquer tupla, é possível acessar os 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 arrays.
Uma tupla pode ser desempacotada em elementos individuais usando atribuição múltipla. Para elementos que não são necessários, use o sublinhado _ como variável descartável.
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 já conhece bem essa sintaxe de atribuição múltipla.
Um Tuple contém apenas valores. Um NamedTuple associa cada valor a um nome.
Os campos individuais podem então ser acessados 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, prefixado com dois-pontos :), então há uma sintaxe alternativa disponível:
julia> nt[:b]
7.3
É fácil obter os nomes (também chamados de "chaves") ou os valores separadamente:
julia> nt
(a = 1, b = 7.3)
julia> keys(nt)
(:a, :b)
julia> values(nt)
(1, 7.3)
Repare 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 nesse caso, pois oferece segurança dos dados e permite otimizações mais agressivas do compilador.
Azara e Rui são colegas de equipe competindo em uma caçada ao tesouro com tema de piratas. Um tem uma lista de tesouros com coordenadas no mapa, o outro uma lista de nomes de locais com coordenadas no mapa. Também receberam mapas em branco com um ponto de partida marcado como VOCÊ ESTÁ 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 não param de olhar de uma lista para a outra para descobrir quais tesouros vão com quais locais. Como estão começando a programar em Julia, vieram até você para pedir ajuda na escrita de um pequeno programa (na verdade, um conjunto de funções) para organizar melhor as informações da caçada.
Implemente a função get_cooordinate(), que recebe um par (treasure, coordinate) da lista da Azara e retorna apenas a coordenada do mapa extraída.
julia> get_cooordinate( ("Scrimshaw Whale's Tooth", "2A") )
"2A"
Implemente a função convert_coordinate(), que recebe uma coordenada no formato "2A" e retorna uma tupla no formato ('2', 'A').
julia> convert_coordinate("2A")
('2', 'A')
Implemente a função compare_records(), que recebe um par (treasure, coordinate) e um registro (location, coordinate, quadrant) e compara as coordenadas de cada um.
Retorne true se as coordenadas "coincidirem" e retorne false se não coincidirem.
Reformate as coordenadas conforme necessário para uma comparação 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
Implemente a função create_record(), que recebe um par (treasure, coordinate) da lista da Azara e um registro (location, coordinate, quadrant) da lista do Rui e retorna (coordinate, location, quadrant, treasure) se as coordenadas coincidirem.
Se as coordenadas não coincidirem, retorne uma tupla vazia. Reformate as coordenadas conforme necessário para uma comparação 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"))
()
Crie sua conta no Exercism para aprender e dominar Julia com 35 conceitos128 exercícios e mentoria humana de verdade, tudo de graça.