अंग्रेज़ी बोलने के कुछ तरीकों में, जब आप "two for" जल्दी बोलते हैं, तो वह "two fer" जैसा सुनाई देता है। Two-for-one कहने का मतलब है कि अगर आप एक चीज़ खरीदते हैं, तो आपको एक और मुफ्त में मिल जाती है। इसलिए "two-fer" वाक्यांश अक्सर two-for-one ऑफर का संकेत देता है।
कल्पना कीजिए एक बेकरी की, जहाँ छुट्टियों का ऑफर है और आप एक की कीमत पर दो कुकीज़ खरीद सकते हैं ("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 डिफॉल्ट आर्गुमेंट का समर्थन करता है। डिफॉल्ट आर्गुमेंट एक बहुत काम का फीचर है। इससे एक ही प्रोसीजर को अलग-अलग पैरामीटर के सेट के साथ कॉल किया जा सकता है, ऐसी जगहों पर जहाँ आपको आपस में जुड़े, पर अलग-अलग 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 के आधिकारिक डॉक्युमेंटेशन में डिफॉल्ट आर्गुमेंट और Odin के नामित आर्गुमेंट के बारे में भी दिलचस्पी हो सकती है।