Two Fer

Two Fer

Könnyű

Bevezetés

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.

Utasítások

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.

Odin-specifikus utasítások

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)

Memóriakezelés

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.


Forrás

Fedezd fel a feladat forrását.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Odin Exercism

Készen állsz elkezdeni a(z) Two Fer feladatot?

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.