Bizonyos angol akcentusokban, ha gyorsan mondod, hogy „two for”, az úgy hangzik, mint a „two fer”. A two-for-one azt jelenti, hogy ha veszel egyet, kapsz egy másikat ingyen. Így a „two-fer” kifejezés gyakran egy kettőt egy áráért szóló ajánlatra utal.
Képzelj el egy pékséget, ahol ünnepi akció keretében két sütit vehetsz egy áráért („two-fer one!”). Elfogadod az ajánlatot, és (nagyon nagylelkűen) úgy döntesz, hogy a plusz sütit odaadod valaki másnak, aki a sorban áll.
A feladatod, hogy eldöntsd, mit mondasz, amikor odaadod a plusz sütit.
Ha ismered a személy nevét (például ha Do-yun a neve), akkor ezt mondod:
One for Do-yun, one for me.
Ha viszont nem ismered a személy nevét, akkor helyette a you szót mondod.
One for you, one for me.
Íme néhány példa:
| Név | Párbeszéd |
|---|---|
| Alice | One for Alice, one for me. |
| Bohdan | One for Bohdan, one for me. |
| One for you, one for me. | |
| Zaphod | One for Zaphod, one for me. |
Az Odin támogatja az alapértelmezett argumentumokat. Ez egy hasznos lehetőség: segítségével egy eljárás többféle paraméterkészlettel is meghívható olyan esetekben, amikor egymással rokon, de eltérő API-kra van szükséged.
Alapértelmezett argumentumok nélkül könnyen azzal szembesülhetsz, hogy robbanásszerűen megnő az API-hoz szükséges eljárások száma. Az olyan nyelvek, amelyek nem támogatják az alapértelmezett argumentumokat, például a Java, a metódusok túlterhelésével érik el ugyanezt a hatást (több kóddal), vagy olyan eljárásokat kénytelenek biztosítani, amelyeknek esetleg nagyon sok argumentuma van.
Nézzük például a greeting eljárást, ahol szeretnénk megadni a nyelvet, azt, hogy a név csupa nagybetűvel szerepeljen-e, és azt, hogy a köszöntés végére kerüljön-e felkiáltójel. Egy kis elemzés után azt találtuk, hogy a felhasználók legnagyobb csoportja angolt ad meg nyelvként, nem írja a nevet csupa nagybetűvel, és nem kér felkiáltójelet a végére, a második legnagyobb csoport viszont felkiáltójelet tesz a köszöntés végére.
Készíthetnénk egyetlen eljárást az összes argumentummal:
greeting :: proc(name: string, language: Language, do_uppercase: bool, add_exclamation: bool) {
...
}
Ez arra kényszerítené az összes felhasználót, hogy elolvassák az összes argumentum dokumentációját, és mindig kitöltsék őket.
Alapértelmezett argumentumok nélkül több eljárást is definiálhatnánk különböző paraméterkészletekkel:
greeting_common :: proc(name: string) {...}
greeting_with_exclamation :: proc(name: string) {...}
greeting_general :: proc(name: string, language: Language, do_uppercase: bool, add_exclamation: bool) {...}
// Odin supports overloading but it has to be explicitly defined
greeting :: proc {
greeting_common,
greeting_with_exclamation,
greeting_general,
}
Ha a nyelved támogatja az alapértelmezett argumentumokat, ahogy az Odin is, akkor egyszerűen adj észszerű alapértékeket a legritkábban használt argumentumoknak. A hívó fél kihagyhatja az alapértelmezett argumentumokat, ilyenkor az eljárás a megadott alapértékeket használja, de felül is írhatja őket.
greeting :: proc(name: string, language: Language = Language.English, do_uppercase : bool = false, add_exclamation: bool = false) {...}
// Note: because Odin supports type inference, we can simplify the interface.
greeting :: proc(name: string, language:= Language.English, do_uppercase := false, add_exclamation:= false) {...}
Az eljárás meghívható úgy, hogy minden argumentum az alapértékét kapja:
greeting("John Doe")
A hívó fél számára fontos argumentumok felülírhatók:
greeting("John Doe", Language.Spanish)
Ha a szükséges argumentumok pozíciós sorrendben állnak, mint a fenti példában, akkor nem kell megnevezni őket, de ha ki kell hagynod néhányat, akkor az első kihagyott argumentum utáni argumentumokat már név szerint kell megadnod.
greeting("John Doe", add_exclamation=true)
Ebben a feladatban olyan eljárást fogsz megvalósítani, amelynek az a feladata, hogy lefoglalja az általa visszaadott stringet. A string felszabadítása az eljárás hívójának a feladata.
// The procedure will be called like that:
str := two_fer("Alice")
// ...
// and eventually the caller will delete the string
delete(str)
Érdekelhet az Odin hivatalos dokumentációja is az alapértelmezett argumentumokról és az Odin név szerinti argumentumairól.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Odin nyelvet 73 feladat segítségével, valódi emberi mentorálással, mindez ingyen.