A Tuple sok szempontból nagyon hasonlít a Vector-hoz (egydimenziós array).
Néhány fontos különbség azonban van.
( ) közé írjuk szögletes zárójel [ ] helyett, bár a kerek zárójel elhagyható, ha a jelentés egyértelmű.A módosíthatatlanság miatt a fordító több optimalizálást tud végezni, és a tuple-ok gyorsabbak a vektoroknál, ezért érdemes előnyben részesíteni őket, amikor nincs szükség módosíthatóságra.
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})
Létezik egy Tuple() konstruktor is, amely bármilyen bejárható gyűjteményt tuple-vá alakít.
Hasznos módon a stringet karakterek bejárható gyűjteményeként kezeli.
julia> Tuple("Julia")
('J', 'u', 'l', 'i', 'a')
Bármelyik tuple esetében hozzáférhetsz az elemekhez index alapján, vagy végigmehetsz rajtuk egy ciklussal.
Bármelyik tisztán numerikus tuple használható matematikai függvényekben, például a sum() esetében is, pontosan úgy, mint a tömbök.
Egy tuple kicsomagolható az egyes elemeire többes értékadással.
A nem szükséges elemek helyére írj aláhúzásjelet _ dummy változóként.
julia> tup = (1, "Julia", true)
(1, "Julia", true)
julia> num, name, _ = tup
(1, "Julia", true)
julia> uppercase(name), 2num
("JULIA", 2)
A Python-programozók számára ez a többes értékadásos szintaxis nagyon ismerős lesz.
A Tuple csak értékeket tartalmaz.
A NamedTuple minden értékhez hozzárendel egy nevet.
Az egyes mezők ezután »pont« jelöléssel érhetők el:
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
A nevet a rendszer belül Symbol típusként tárolja (módosíthatatlan típus, kettőspont : előtaggal), ezért egy alternatív szintaxis is elérhető:
julia> nt[:b]
7.3
Könnyen hozzájuthatsz külön a nevekhez (más néven »kulcsok«) vagy az értékekhez:
julia> nt
(a = 1, b = 7.3)
julia> keys(nt)
(:a, :b)
julia> values(nt)
(1, 7.3)
Vedd figyelembe, hogy egy nevesített tuple bejárása csak az értékeket adja, a neveket figyelmen kívül hagyja.
A tuple-ok (akár nevesítettek, akár nem) nagyon gyakori módjai a strukturált adatok függvényekhez való átadásának és visszavételének. Ebben a felhasználási esetben a módosíthatatlanság előnyös: adatbiztonságot nyújt, és agresszívabb fordítói optimalizálást tesz lehetővé.
Azara és Rui csapattársak, akik egy kalóztémájú kincsvadászaton versenyeznek. Az egyiküknél a kincsek listája van térképkoordinátákkal, a másikuknál a helyszínnevek listája térképkoordinátákkal. Kaptak üres térképeket is, amelyeken a kiindulópont „ITT VAGY” felirattal van megjelölve.
| Azara listája | Rui listája | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
A dolgok azonban kissé rendezetlenek: úgy tűnik, Azara koordinátái másképp vannak formázva és rendezve, mint Ruiéi, és folyton egyik listáról a másikra kell pillantaniuk, hogy kitalálják, melyik kincs melyik helyszínhez tartozik. Mivel feltörekvő Julia-programozók, hozzád fordultak segítségért, hogy írj egy kis programot (valójában függvények egy csoportját), amivel jobban rendszerezhetik a vadászathoz tartozó információikat.
Valósítsd meg a get_cooordinate() függvényt, amely egy (treasure, coordinate) párt vesz át Azara listájáról, és csak a kinyert térképkoordinátát adja vissza.
julia> get_cooordinate( ("Scrimshaw Whale's Tooth", "2A") )
"2A"
Valósítsd meg a convert_coordinate() függvényt, amely egy „2A” formátumú koordinátát vesz át, és egy ('2', 'A') formátumú tuple-t ad vissza.
julia> convert_coordinate("2A")
('2', 'A')
Valósítsd meg a compare_records() függvényt, amely egy (treasure, coordinate) párt és egy (location, coordinate, quadrant) rekordot vesz át, és összehasonlítja a kettő koordinátáit.
Add vissza a true értéket, ha a koordináták „egyeznek”, és a false értéket, ha nem.
Formázd újra a koordinátákat, ha a pontos összehasonlításhoz szükséges.
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
Valósítsd meg a create_record() függvényt, amely egy (treasure, coordinate) párt vesz át Azara listájáról és egy (location, coordinate, quadrant) rekordot Rui listájáról, és visszaadja a (coordinate, location, quadrant, treasure) értéket, ha a koordináták egyeznek.
Ha a koordináták nem egyeznek, adj vissza egy üres tuple-t. Formázd újra a koordinátákat, ha a pontos összehasonlításhoz szükséges.
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"))
()
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.