Muitas linguagens têm uma forma como null ou none de indicar um valor inexistente.
Como Julia foi projetada para lidar com grandes volumes de dados (muitas vezes bagunçados), ela tem várias formas de representar o nada.
O objetivo geral é sinalizar valores ausentes ou suspeitos conforme eles aparecem, e então continuar sem lançar uma exceção.
nothingSe um valor realmente não existe, ele é representado por nothing. Provavelmente é o que mais se aproxima do que o C (NULL) ou o Python (None) fazem.
julia> n = nothing
julia> isnothing(n)
true
julia> typeof(n)
Nothing
Então nothing é um valor singleton do tipo Nothing, e podemos testá-lo.
Um uso comum de nothing é como valor de retorno (ou de não retorno) de funções que existem apenas pelos seus efeitos colaterais (imprimir, configurar a rede, ou qualquer outra coisa).
missingPara situações em que um valor existe em teoria, mas não sabemos qual é, usa-se missing.
Por exemplo, ao contar veículos que trafegam por uma estrada, observadores humanos podem precisar fazer uma pausa ou sensores automáticos podem falhar, mas o tráfego continua fluindo.
Assim, missing é um marcador de posição, avisando às pessoas que elas precisam decidir como lidar com essa lacuna nos dados.
julia> mv = [1, 2, missing]
3-element Vector{Union{Missing, Int64}}:
1
2
missing
julia> typeof(mv)
Vector{Union{Missing, Int64}} (alias for Array{Union{Missing, Int64}, 1})
julia> ismissing.(mv) # broadcast function, displays as 1 for true, 0 for false
3-element BitVector:
0
0
1
Poucas outras linguagens têm esse recurso embutido, mas analogias próximas são NA no R ou NULL no SQL.
As expressões geralmente retornam missing por padrão se houver valores missing.
Se você quiser que esses valores sejam ignorados, use a função skipmissing() para deixar isso explícito:
julia> mv = [1, 2, missing]
3-element Vector{Union{Missing, Int64}}:
1
2
missing
julia> sum(mv) # missing in, missing out
missing
julia> skipmissing(mv)
skipmissing(Union{Missing, Int64}[1, 2, missing])
julia> collect(skipmissing(mv))
2-element Vector{Int64}:
1
2
julia> sum(skipmissing(mv)) # functions like sum() can work with iterators
3
Como skipmissing cria um iterador, envolva-o em collect() se você precisar de um vetor.
Às vezes é útil substituir valores missing por algum padrão.
A macro @coalesce() é útil para isso, pois retorna o primeiro valor que não for missing (ou missing se não houver mais nada).
julia> str = ["I", "exist", missing]
3-element Vector{Union{Missing, String}}:
"I"
"exist"
missing
julia> [@coalesce(s, "-") for s in str]
3-element Vector{String}:
"I"
"exist"
"-"
NaNAbreviação de "Not a Number", NaN sinaliza um problema de cálculo em situações em que se esperava um número.
julia> v = [0, 1, -1]
3-element Vector{Int64}:
0
1
-1
julia> v / 0
3-element Vector{Float64}:
NaN
Inf
-Inf
julia> sum(v / 0)
NaN
Qualquer tipo de cálculo sobre dados que incluam um NaN dará um resultado NaN.
No momento não existe uma função especial para remover valores NaN, mas a função filter() padrão consegue fazer isso de forma bem simples.
Só os valores para os quais alguma condição dada é true serão copiados para o array resultante:
julia> filter(!isnan, [1, 2, NaN])
2-element Vector{Float64}:
1.0
2.0
Neste exercício, você vai escrever código para criar crachás que os funcionários da fábrica vão usar. Cada funcionário tem um ID, um nome e o nome de um departamento. As etiquetas dos crachás dos funcionários seguem este formato: "[id] - name - DEPARTMENT".
Implemente a função print_name_badge. Ela deve receber um ID, um nome e um departamento. Ela deve retornar a etiqueta do crachá, com o nome do departamento em letras maiúsculas.
julia> print_name_badge(67, "Katherine Williams", "Strategic Communication")
"[67] - Katherine Williams - STRATEGIC COMMUNICATION"
Por causa de uma peculiaridade do sistema, às vezes os novos funcionários ainda não têm um ID quando começam a trabalhar na fábrica. Como o crachá é obrigatório, eles recebem um crachá temporário, sem o prefixo com o ID.
Estenda a função print_name_badge. Quando o ID estiver ausente, ela deve criar um crachá sem ele.
julia> print_name_badge(missing, "Robert Johnson", "Procurement")
"Robert Johnson - PROCUREMENT"
Até o dono da fábrica precisa usar um crachá o tempo todo. No entanto, o dono não tem um departamento e nunca vai ter: ele está acima de todos os departamentos. Nesse caso, a etiqueta deve retornar "OWNER" no lugar do nome do departamento.
Estenda a função print_name_badge. Quando o departamento for nothing, considere que o crachá pertence ao dono da empresa.
julia> print_name_badge(204, "Rachel Miller", nothing)
"[204] - Rachel Miller - OWNER"
Repare que é possível que o dono também seja um novo funcionário.
julia> print_name_badge(missing, "Rachel Miller", nothing)
"Rachel Miller - OWNER"
Como uma métrica aproximada de quão bem os IDs estão sendo emitidos, você quer ver o salário somado dos funcionários sem ID. Um valor alto significa que muita gente está esperando, ou que o problema está afetando funcionários mais experientes: as duas coisas são ruins.
Implemente a função salaries_no_id, que recebe um vetor de IDs e um vetor correspondente de salários, e retorna a soma dos salários das pessoas que ainda não têm ID. Os dois vetores têm o mesmo comprimento.
julia> ids = [204, missing, 210, 352, missing, 263]
julia> salaries = [23, 21, 47, 35, 17, 101] * 1000
julia> salaries_no_id(ids, salaries)
38,000
Crie sua conta no Exercism para aprender e dominar Julia com 35 conceitos128 exercícios e mentoria humana de verdade, tudo de graça.