Track
/
Odin
Odin
/
Esercizi
/
Two Fer
Two Fer

Two Fer

Facile

Introduzione

In alcuni accenti inglesi, quando dici «two for» velocemente, suona come «two fer». Two-for-one è un modo per dire che se ne compri uno, ne ottieni un altro gratis. Quindi l'espressione «two-fer» spesso implica un'offerta due per uno.

Immagina una panetteria che ha un'offerta festiva: puoi comprare due biscotti al prezzo di uno («two-fer one!»). Approfitti dell'offerta e (con grande generosità) decidi di regalare il biscotto in più a qualcun altro in coda.

Istruzioni

Il tuo compito è determinare cosa dirai quando regalerai il biscotto in più.

Se conosci il nome della persona (ad esempio se si chiama Do-yun), dirai:

One for Do-yun, one for me.

Se non conosci il nome della persona, dirai invece you.

One for you, one for me.

Ecco alcuni esempi:

Nome Dialogo
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.

Istruzioni specifiche per Odin

Odin supporta gli argomenti predefiniti. Gli argomenti predefiniti sono una funzionalità utile: permettono di chiamare una procedura con insiemi diversi di parametri, nei casi in cui servono API correlate ma diverse.

Senza argomenti predefiniti, il numero di procedure necessarie per l'API può esplodere. I linguaggi che non supportano gli argomenti predefiniti, come Java, si affidano al sovraccarico dei metodi per ottenere lo stesso effetto (con più codice), oppure devono fornire procedure con un insieme di argomenti potenzialmente molto ampio.

Prendiamo l'esempio di una procedura greeting in cui vogliamo poter specificare la lingua, se il nome è in maiuscolo e se aggiungere un punto esclamativo alla fine del saluto. Dopo qualche analisi, abbiamo scoperto che il gruppo più numeroso di utenti specifica l'inglese come lingua, non mette il nome in maiuscolo e non vuole un punto esclamativo alla fine; il secondo gruppo più numeroso aggiunge un punto esclamativo alla fine del saluto.

Potremmo produrre un'unica procedura con tutti gli argomenti:

greeting :: proc(name: string, language: Language, do_uppercase: bool, add_exclamation: bool) {
	...
}

Questo costringerebbe tutti gli utenti a leggere la documentazione di tutti gli argomenti e a valorizzarli sempre.

Senza argomenti predefiniti, potremmo anche definire più procedure con insiemi diversi di parametri:

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,
}

Se il tuo linguaggio supporta gli argomenti predefiniti, come fa Odin, ti basta fornire valori predefiniti sensati agli argomenti usati meno. Chi chiama può saltare gli argomenti predefiniti, facendo sì che la procedura usi i valori predefiniti forniti, oppure sovrascriverli.

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) {...}

La procedura può essere chiamata con tutti gli argomenti predefiniti:

greeting("John Doe")

Gli argomenti importanti per chi chiama si possono sovrascrivere:

greeting("John Doe", Language.Spanish)

Se gli argomenti che ti servono sono in ordine posizionale, come nell'esempio qui sopra, non serve nominarli; se invece devi saltarne alcuni, allora devi nominare gli argomenti successivi al primo che hai saltato.

greeting("John Doe", add_exclamation=true)

Gestione della memoria

In questo esercizio implementerai una procedura che deve allocare la stringa che restituisce. La deallocazione della stringa è responsabilità di chi chiama la procedura.

// The procedure will be called like that:
str := two_fer("Alice")
// ...
// and eventually the caller will delete the string
delete(str)

Potresti anche essere interessato alla documentazione ufficiale di Odin sugli argomenti predefiniti e sugli argomenti con nome di Odin.


Fonte

Esplora la fonte di questo esercizio.

Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Odin Exercism

Vuoi iniziare Two Fer?

Iscriviti a Exercism per imparare e padroneggiare Odin con 73 esercizi e il mentoring di persone reali, tutto gratis.