Two Fer

Two Fer

Εύκολο

Εισαγωγή

Σε κάποιες αγγλικές προφορές, όταν λες γρήγορα "two for", ακούγεται σαν "two fer". Το two-for-one είναι ένας τρόπος να πεις ότι αν αγοράσεις ένα, παίρνεις κι ένα δωρεάν. Έτσι, η φράση "two-fer" συχνά υπονοεί μια προσφορά δύο για ένα.

Φαντάσου ένα αρτοποιείο που έχει μια γιορτινή προσφορά, όπου μπορείς να αγοράσεις δύο μπισκότα στην τιμή του ενός ("two-fer one!"). Δέχεσαι την προσφορά και (πολύ γενναιόδωρα) αποφασίζεις να δώσεις το επιπλέον μπισκότο σε κάποιον άλλο στην ουρά.

Οδηγίες

Η αποστολή σου είναι να καθορίσεις τι θα πεις καθώς χαρίζεις το επιπλέον μπισκότο.

Αν ξέρεις το όνομα του ατόμου (π.χ. αν το όνομά του είναι Do-yun), τότε θα πεις:

One for Do-yun, one for me.

Αν δεν ξέρεις το όνομα του ατόμου, θα πεις you αντί γι' αυτό.

One for you, one for me.

Ορίστε μερικά παραδείγματα:

Όνομα Διάλογος
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

Η Odin υποστηρίζει προεπιλεγμένα ορίσματα. Τα προεπιλεγμένα ορίσματα είναι ένα χρήσιμο χαρακτηριστικό που επιτρέπει να καλείται μια διαδικασία με διαφορετικά σύνολα παραμέτρων, για περιπτώσεις όπου χρειάζεσαι συναφή αλλά διαφορετικά API.

Χωρίς προεπιλεγμένα ορίσματα, μπορεί να καταλήξεις με έναν καταιγισμό διαδικασιών για το API σου. Οι γλώσσες που δεν υποστηρίζουν προεπιλεγμένα ορίσματα, όπως η Java, βασίζονται στην υπερφόρτωση μεθόδων για να πετύχουν το ίδιο αποτέλεσμα (με περισσότερο κώδικα) ή πρέπει να παρέχουν διαδικασίες με, ενδεχομένως, ένα μεγάλο σύνολο ορισμάτων.

Ας πάρουμε το παράδειγμα μιας διαδικασίας greeting, όπου θέλουμε να μπορούμε να ορίσουμε τη γλώσσα, αν το όνομα είναι κεφαλαία, και αν πρέπει να βάλουμε ένα θαυμαστικό στο τέλος του χαιρετισμού. Ύστερα από κάποια ανάλυση, διαπιστώσαμε ότι η μεγαλύτερη ομάδα χρηστών ορίζει τα αγγλικά ως γλώσσα, δεν γράφει το όνομα με κεφαλαία και δεν θέλει θαυμαστικό στο τέλος, ενώ η δεύτερη μεγαλύτερη ομάδα προσθέτει ένα θαυμαστικό στο τέλος του χαιρετισμού.

Θα μπορούσαμε να φτιάξουμε μία μόνο διαδικασία με όλα τα ορίσματα:

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

Αυτό θα ανάγκαζε όλους τους χρήστες να διαβάσουν την τεκμηρίωση για όλα τα ορίσματα και να τα συμπληρώνουν πάντα.

Χωρίς προεπιλεγμένα ορίσματα, θα μπορούσαμε επίσης να ορίσουμε πολλές διαδικασίες με διαφορετικά σύνολα παραμέτρων:

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

Αν η γλώσσα σου υποστηρίζει προεπιλεγμένα ορίσματα, όπως η Odin, μπορείς απλώς να δώσεις λογικές προεπιλεγμένες τιμές στα ορίσματα που χρησιμοποιούνται λιγότερο. Όσοι καλούν τη διαδικασία μπορούν να παραλείψουν τα προεπιλεγμένα ορίσματα, οπότε η διαδικασία χρησιμοποιεί τις προεπιλεγμένες τιμές που δόθηκαν, ή να τις αντικαταστήσουν.

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

Η διαδικασία μπορεί να κληθεί με όλα τα ορίσματα στις προεπιλεγμένες τους τιμές:

greeting("John Doe")

Τα ορίσματα που είναι σημαντικά για όποιον καλεί τη διαδικασία μπορούν να αντικατασταθούν:

greeting("John Doe", Language.Spanish)

Αν τα ορίσματα που χρειάζεσαι δίνονται με σειρά θέσης, όπως στο παράδειγμα παραπάνω, δεν χρειάζεται να τα ονομάσεις όπως στο παράδειγμα παραπάνω, αλλά αν πρέπει να παραλείψεις κάποια, τότε πρέπει να ονομάσεις τα ορίσματα μετά το πρώτο που παράλειψες.

greeting("John Doe", add_exclamation=true)

Διαχείριση μνήμης

Σε αυτή την άσκηση θα υλοποιήσεις μια διαδικασία που προορίζεται να δεσμεύσει τη συμβολοσειρά που επιστρέφει. Η αποδέσμευση της συμβολοσειράς είναι ευθύνη όποιου καλεί τη διαδικασία.

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

Μπορεί επίσης να σε ενδιαφέρει η επίσημη τεκμηρίωση της Odin για τα προεπιλεγμένα ορίσματα και τα ονομαστά ορίσματα.


Πηγή

Εξερεύνησε την πηγή αυτής της άσκησης.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Odin Exercism

Έτοιμος να ξεκινήσεις την άσκηση Two Fer;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Odin με 73 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.