Sok nyelvben van valami, például a null vagy a none, amivel egy nem létező értéket lehet jelölni.
Mivel a Juliát nagy mennyiségű, gyakran rendezetlen adat kezelésére tervezték, többféle formában is kifejezi a semmit.
A fő cél, hogy a hiányzó vagy gyanús értékeket már akkor megjelölje, amikor előkerülnek, majd kivétel dobása nélkül folytassa a működést.
nothingHa egy érték valóban nem létezik, azt a nothing képviseli. Ez áll valószínűleg legközelebb ahhoz, amit a C (NULL) vagy a Python (None) tenne.
julia> n = nothing
julia> isnothing(n)
true
julia> typeof(n)
Nothing
A nothing tehát a Nothing típus egyetlen értéke, és tesztelni is tudjuk.
A nothing egyik gyakori felhasználása, hogy visszatérési (nem)értékként szolgál azoknak a függvényeknek, amelyeket csak a mellékhatásaik miatt hívunk (kiírás, hálózat beállítása, vagy bármi más).
missingAzokban az esetekben, amikor egy érték elvileg létezik, de nem tudjuk, mi az, a missing használatos. Például amikor az úton haladó járműveket számoljuk, előfordulhat, hogy az emberi megfigyelőknek szünetre van szükségük, vagy meghibásodnak az automatikus érzékelők, a forgalom viszont tovább halad.
A missing tehát egy helyőrző, amely figyelmezteti az embereket, hogy dönteniük kell, mit kezdenek az adatokban keletkezett hézaggal.
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
Kevés más nyelvben van ez a funkció beépítve, de közeli megfelelői az R NA-ja vagy az SQL NULL-ja.
A fenti példában szereplő vektor típusa Union{Missing, Int64}, ami némileg hasonlít más nyelvek Option vagy Maybe típusához.
A kifejezések alapértelmezés szerint általában missing értéket adnak vissza, ha missing értékek vannak bennük.
Ha azt szeretnéd, hogy ezeket az értékeket figyelmen kívül hagyják, használd a skipmissing() függvényt, hogy ezt egyértelművé tedd:
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
Mivel a skipmissing egy iterátort hoz létre, ha vektorra van szükséged, az collect() függvénnyel csomagold be.
Néha hasznos, ha a missing értékeket valamilyen alapértelmezett értékkel helyettesítjük.
Erre a @coalesce() makró hasznos, mert az első nem hiányzó értéket adja vissza (vagy missing-et, ha nincs más).
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"
"-"
NaNA NaN a „Not a Number”, azaz „nem szám” rövidítése, és olyan helyzetekben jelez számítási problémát, ahol számot vártunk volna.
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
Ha az adatok között NaN szerepel, bármilyen számítás NaN eredményt ad.
Jelenleg nincs külön függvény a NaN értékek eltávolítására, de a szabványos filter() függvény ezt egészen egyszerűen megoldja.
Csak azok az értékek kerülnek be az eredménytömbbe, amelyekre a megadott feltétel true:
julia> filter(!isnan, [1, 2, NaN])
2-element Vector{Float64}:
1.0
2.0
Ezzel valószínűleg ritkábban találkozol majd. Kivétel például:
struct-ot) létrehozhatod inicializálatlan mezőkkel is.
A Julia általában alapértelmezett értékeket próbál használni, de ezt csak akkor teheti meg, ha elég információja van a mező típusának kikövetkeztetéséhez.undef értékkel való inicializálása rugalmas és gyors megközelítés lehet.
Ezt például a Circular Buffer feladat közösségi megoldásaiban is alkalmazták (ez egy haladó technika, a feladat viszont nehéz besorolást kapott).Ha egy érték elérésére tett kísérlet undef eredményt ad, az hibás állapot, amelyet általában egy UndefRefError jelez.