Sok nyelvben van valami olyasmi, mint a null vagy a none, amivel egy nem létező értéket lehet jelölni.
Mivel a Juliát arra tervezték, hogy nagy mennyiségű, gyakran rendezetlen adattal boldoguljon, a semminek több formáját is ismeri.
A cél összességében az, hogy a hiányzó vagy gyanús értékeket már ott megjelölje, ahol felbukkannak, majd pedig kivétel dobása nélkül folytassa.
nothingHa egy érték valóban nem létezik, azt a nothing jelöli. Ez áll valószínűleg a 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 lehetséges értéke, és tesztelni is tudjuk.
A nothing egyik gyakori felhasználása az, hogy visszatérési (nem)értékként szolgál olyan függvényeknél, amelyeket kizárólag a mellékhatásaik miatt hívunk meg (nyomtatás, hálózati beállítások, vagy bármi hasonló).
missingAzokban az esetekben, amikor egy érték elvileg létezik, de nem tudjuk, mi az, a missing használatos.
Amikor például az úton haladó járműveket számoljuk, előfordulhat, hogy az emberi megfigyelőknek szünetet kell tartaniuk, vagy az automata érzékelők romlanak el, a forgalom viszont tovább folyik.
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ője az R-beli NA vagy az SQL-beli NULL.
Ha missing értékek vannak jelen, a kifejezések alapértelmezés szerint általában missing-et adnak vissza.
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, csomagold collect()-be.
Néha hasznos a missing értékeket valamilyen alapértelmezett értékkel helyettesíteni.
Erre az @coalesce() makró hasznos, mert az első nem missing é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 „Not a Number” rövidítéseként a NaN egy számítási problémát jelez olyan helyzetekben, ahol egy 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 eredménye NaN lesz.
Jelenleg nincs külön függvény a NaN értékek eltávolítására, de a szabványos filter() függvénnyel ez egészen egyszerűen megoldható.
Csak azok az értékek másolódnak az eredménytömbbe, amelyekre a megadott feltétel true:
julia> filter(!isnan, [1, 2, NaN])
2-element Vector{Float64}:
1.0
2.0
Ebben a feladatban olyan kódot írsz, amely névjelvényeket készít a gyár alkalmazottainak, hogy viselhessék őket. Az alkalmazottaknak van azonosítójuk, nevük és részlegnevük. A névjelvények címkéi a következő formátumban készülnek: "[id] - name - DEPARTMENT".
Valósítsd meg a print_name_badge függvényt. Egy azonosítót, egy nevet és egy részleget vár. A jelvény címkéjét adja vissza, a részlegnévvel csupa nagybetűvel.
julia> print_name_badge(67, "Katherine Williams", "Strategic Communication")
"[67] - Katherine Williams - STRATEGIC COMMUNICATION"
A számítógépes rendszer egy furcsasága miatt előfordul, hogy az új alkalmazottaknak még nincs azonosítójuk, amikor elkezdenek dolgozni a gyárban. Mivel a jelvény kötelező, ideiglenes jelvényt kapnak, azonosító előtag nélkül.
Egészítsd ki a print_name_badge függvényt. Ha hiányzik az azonosító, akkor nélküle készítsen jelvényt.
julia> print_name_badge(missing, "Robert Johnson", "Procurement")
"Robert Johnson - PROCUREMENT"
Még a gyár tulajdonosának is mindig jelvényt kell viselnie. A tulajdonosnak azonban nincs részlege, és soha nem is lesz: minden részleg felett áll. Ebben az esetben a címke a részlegnév helyett "OWNER" értéket ad vissza.
Egészítsd ki a print_name_badge függvényt. Ha a részleg nothing, feltételezd, hogy a jelvény a cég tulajdonosáé.
julia> print_name_badge(204, "Rachel Miller", nothing)
"[204] - Rachel Miller - OWNER"
Vedd figyelembe, hogy előfordulhat, hogy a tulajdonos egyben új alkalmazott is.
julia> print_name_badge(missing, "Rachel Miller", nothing)
"Rachel Miller - OWNER"
Durva mérőszámként szeretnéd látni, hogy milyen jól halad az azonosítók kiadása: az azonosító nélküli alkalmazottak összbérét akarod megtekinteni. A magas érték azt jelenti, hogy sokan várnak, vagy hogy a probléma a tapasztalt munkatársakat is érinti: mindkettő rossz.
Valósítsd meg a salaries_no_id függvényt, amely egy azonosítókból álló vektort és a hozzájuk tartozó béreket tartalmazó vektort kap, és visszaadja azon emberek bérének összegét, akiknek még nincs azonosítójuk. Mindkét vektor ugyanolyan hosszú.
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
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Julia nyelvet 35 fogalom128 feladat segítségével, valódi emberi mentorálással, mindez ingyen.