जेनेरिक्स की मदद से आप बिना कोड दोहराए ऐसा कोड लिख सकते हैं जो कई टाइप के साथ काम करता है। जेनेरिक टाइप बनाने के लिए एंगल ब्रैकेट <T> का प्रयोग कीजिए, जहाँ T किसी भी टाइप के लिए एक प्लेसहोल्डर है।
fn largest_list<T>(l1: Array<T>, l2: Array<T>) -> Array<T> {
if l1.len() > l2.len() {
l1
} else {
l2
}
}
Cairo में ट्रेट बाउंड्स ज़रूरी होते हैं, जो तय करते हैं कि जेनेरिक टाइप को किन-किन ऑपरेशन का समर्थन करना है। आप + सिंटैक्स का उपयोग करके प्रतिबंध जोड़ सकते हैं:
fn process_data<T, +Drop<T>, +Copy<T>>(value: T) -> T {
// Function body
}
स्ट्रक्ट भी जेनेरिक हो सकते हैं:
#[derive(Drop)]
struct Container<T> {
value: T,
}
ट्रेट भी जेनेरिक हो सकते हैं, जिससे वे अलग-अलग टाइप के साथ काम कर पाते हैं:
trait Processor<T> {
fn process(self: @T) -> ByteArray;
}
impl MyProcessor<T, +Drop<T>> of Processor<T> {
fn process(self: @T) -> ByteArray {
"processed"
}
}
फंक्शन ऐसे जेनेरिक पैरामीटर भी ले सकते हैं जिन पर ट्रेट बाउंड्स लगे हों, जिससे वे हर उस टाइप के साथ काम करते हैं जो आवश्यक ट्रेट को लागू करता है:
fn use_processor<T, +Processor<T>, +Drop<T>>(item: T) -> ByteArray {
item.process()
}
बर्लिन के नए हवाई अड्डे ने अपनी रोबोट लैब के लिए आपको डेवलपर के तौर पर रखा है। उनके पास भद्दे और कुछ-कुछ मानव जैसे दिखने वाले रोबोट हैं। वे इन रोबोटों को ग्राहक सेवा बेहतर बनाने के लिए इस्तेमाल करने की कोशिश कर रहे हैं।
इस नौकरी में आपका पहला काम यह है: रोबोट को ऐसा प्रोग्राम कीजिए कि लोगों के सेल्फ-चेक-इन काउंटर पर अपना पासपोर्ट स्कैन करने के बाद वह उनका उनकी मातृभाषा में अभिवादन करे।
रोबोट को अपनी क्षमताओं पर गर्व है, इसलिए वह हमेशा पहले बताएगा कि वह कौन-सी भाषा बोल सकता है और फिर उस व्यक्ति का अभिवादन करेगा। उदाहरण के लिए, अगर कोई जर्मन पासपोर्ट स्कैन करता है, तो रोबोट कहेगा:
I can speak German: Hallo Dietrich!
आपको अपना कोड ऐसा ढाँचा देना है कि आप और दूसरे डेवलपर आसानी से नई भाषाएँ जोड़ सकें।
सबसे पहले, दो फंक्शनों वाला एक ट्रेट Greeter बनाइए।
language_name, जो वह भाषा (एक ByteArray) लौटाता है जिसका इस्तेमाल रोबोट आगंतुक का अभिवादन करने के लिए करेगा।greet, जो आगंतुक का नाम (एक ByteArray) लेता है और किसी खास भाषा में अभिवादन का संदेश (एक ByteArray) लौटाता है।इसके बाद say_hello नाम का एक फंक्शन लागू कीजिए। यह आगंतुक का नाम और Greeter ट्रेट लागू करने वाली कोई भी चीज़ लेता है, और मनचाहा अभिवादन (एक ByteArray) लौटाता है।
उदाहरण के लिए, मान लीजिए Greeter का एक जर्मन कार्यान्वयन है, जिसमें language_name तो "German" लौटाता है और greet "Hallo {name}!" लौटाता है:
say_hello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"
अब रोबोट को ऐसा बनाइए कि वह उन लोगों के लिए भी काम करे जो इतालवी पासपोर्ट स्कैन करते हैं।
एक स्ट्रक्चर Italian बनाइए और काम 1 के Greeter ट्रेट को पूरा करने के लिए वे दोनों फंक्शन लागू कीजिए।
आप किसी का इतालवी में अभिवादन "Ciao {name}!" से कर सकते हैं।
दिन का काम खत्म करने से पहले आपको फ्रेंच में लोगों का अभिवादन करने की सुविधा जोड़नी है।
एक स्ट्रक्चर French बनाइए और Greeter ट्रेट को पूरा करने के लिए वे दोनों फंक्शन लागू कीजिए।
आप किसी का फ्रेंच में अभिवादन "Bonjour {name}!" से कर सकते हैं।
Exercism पर साइन अप कीजिए और Cairo को 25 कॉन्सेप्ट68 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।