Tuple कई मामलों में Vector (1-D array) से काफी मिलता-जुलता है। लेकिन दोनों में कुछ ज़रूरी अंतर भी हैं।
[ ] की जगह गोल ब्रैकेट ( ) में लिखे जाते हैं, हालाँकि जहाँ अर्थ स्पष्ट हो वहाँ गोल ब्रैकेट छोड़े जा सकते हैं।अपरिवर्तनीयता की वजह से कंपाइलर ज़्यादा ऑप्टिमाइज़ेशन कर पाता है। इससे टपल, वेक्टर के मुकाबले बेहतर प्रदर्शन देते हैं। इसलिए जहाँ बदलाव की ज़रूरत न हो, वहाँ टपल को प्राथमिकता देनी चाहिए।
julia> t = (3, 5.2, "xyz")
(3, 5.2, "xyz")
# Non-homogeneous:
julia> dump(t)
Tuple{Int64, Float64, String}
1: Int64 3
2: Float64 5.2
3: String "xyz"
julia> t[2]
5.2
# Immutable:
julia> t[2] = 7.3
ERROR: MethodError: no method matching setindex!(::Tuple{Int64, Float64, String})
एक Tuple() कंस्ट्रक्टर भी है, जो किसी भी इटरेबल कलेक्शन को टपल में बदल देता है। काम की बात यह है कि यह स्ट्रिंग को अक्षरों के एक इटरेबल कलेक्शन की तरह मानता है।
julia> Tuple("Julia")
('J', 'u', 'l', 'i', 'a')
किसी भी टपल में आप इंडेक्स के ज़रिए एलिमेंट ऐक्सेस कर सकते हैं या उन पर लूप चला सकते हैं।
जिस टपल में सिर्फ संख्याएँ हों, उसे sum() जैसे गणितीय फंक्शन में भी इस्तेमाल किया जा सकता है, बिल्कुल ऐरे की तरह।
मल्टीपल असाइनमेंट की मदद से एक टपल को अलग-अलग एलिमेंट में बाँटा जा सकता है। जिन एलिमेंटों की ज़रूरत न हो, उनके लिए डमी वेरिएबल के तौर पर अंडरस्कोर _ इस्तेमाल कीजिए।
julia> tup = (1, "Julia", true)
(1, "Julia", true)
julia> num, name, _ = tup
(1, "Julia", true)
julia> uppercase(name), 2num
("JULIA", 2)
Python प्रोग्रामर इस मल्टीपल-असाइनमेंट सिंटैक्स से भली-भाँति परिचित होंगे।
Tuple में सिर्फ वैल्यू होती हैं। NamedTuple हर वैल्यू के साथ एक नाम जोड़ता है।
इसके बाद हर फील्ड को "डॉट" नोटेशन से ऐक्सेस किया जा सकता है:
julia> nt = (a = 1, b = 7.3)
(a = 1, b = 7.3)
julia> dump(nt)
@NamedTuple{a::Int64, b::Float64}
a: Int64 1
b: Float64 7.3
julia> nt.b
7.3
नाम को अंदर ही अंदर Symbol के रूप में संग्रहीत किया जाता है (Symbol एक अपरिवर्तनीय टाइप है, जिसके आगे कोलन : लगाया जाता है), इसलिए एक और सिंटैक्स भी उपलब्ध है:
julia> nt[:b]
7.3
नाम (जिन्हें "की" भी कहा जाता है) या वैल्यू, दोनों को अलग-अलग निकालना आसान है:
julia> nt
(a = 1, b = 7.3)
julia> keys(nt)
(:a, :b)
julia> values(nt)
(1, 7.3)
ध्यान दीजिए कि नेम्ड टपल पर इटरेशन करने से सिर्फ वैल्यू मिलती हैं, नाम अनदेखा कर दिए जाते हैं।
टपल (नेम्ड हों या न हों) फंक्शन को स्ट्रक्चर्ड डेटा भेजने और फंक्शन से वापस लाने का बहुत आम तरीका है। ऐसे इस्तेमाल में अपरिवर्तनीयता फायदेमंद है, क्योंकि इससे डेटा सुरक्षित रहता है और कंपाइलर ज़्यादा आक्रामक ऑप्टिमाइज़ेशन कर पाता है।
अज़ारा और रुई साथी हैं जो समुद्री डाकुओं की थीम वाली एक खज़ाने की खोज में मुकाबला कर रहे हैं। एक के पास नक्शे के निर्देशांकों के साथ खज़ानों की सूची है, और दूसरे के पास नक्शे के निर्देशांकों के साथ जगहों के नामों की सूची है। उन्हें खाली नक्शे भी दिए गए हैं जिनमें शुरुआत की जगह पर YOU ARE HERE लिखा हुआ है।
| अज़ारा की सूची | रुई की सूची | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
लेकिन चीज़ें थोड़ी अव्यवस्थित हैं: अज़ारा के निर्देशांक रुई के निर्देशांकों से अलग ढंग से लिखे और क्रम में लगे दिखते हैं, और कौन-सा खज़ाना किस जगह के साथ जाता है यह पता करने के लिए उन्हें बार-बार एक सूची से दूसरी सूची देखनी पड़ती है। Julia के नए-नए प्रोग्रामर होने के नाते वे आपके पास मदद के लिए आए हैं, ताकि वे अपनी खोज की जानकारी को बेहतर ढंग से व्यवस्थित करने के लिए एक छोटा प्रोग्राम (वास्तव में कुछ फंक्शन) लिख सकें।
get_cooordinate() फंक्शन बनाइए जो अज़ारा की सूची से एक (treasure, coordinate) जोड़ा लेता है और सिर्फ निकाला गया नक्शे का निर्देशांक लौटाता है।
julia> get_cooordinate( ("Scrimshaw Whale's Tooth", "2A") )
"2A"
convert_coordinate() फंक्शन बनाइए जो "2A" प्रारूप वाला एक निर्देशांक लेता है और ('2', 'A') प्रारूप वाला एक टपल लौटाता है।
julia> convert_coordinate("2A")
('2', 'A')
compare_records() फंक्शन बनाइए जो एक (treasure, coordinate) जोड़ा और एक (location, coordinate, quadrant) रिकॉर्ड लेता है और दोनों के निर्देशांकों की तुलना करता है।
अगर निर्देशांक "मेल खाते" हैं तो true लौटाइए, और अगर नहीं मिलते तो false लौटाइए।
सटीक तुलना के लिए ज़रूरत के अनुसार निर्देशांकों का प्रारूप दोबारा बदलिए।
julia> compare_records(("Brass Spyglass", "4B"), ("Seaside Cottages", ('1', 'C'), "blue"))
false
julia> compare_records(("Model Ship in Large Bottle", "8A"), ("Harbor Managers Office", ('8', 'A'), "purple"))
true
create_record() फंक्शन बनाइए जो अज़ारा की सूची से एक (treasure, coordinate) जोड़ा और रुई की सूची से एक (location, coordinate, quadrant) रिकॉर्ड लेता है और अगर निर्देशांक मेल खाते हैं तो (coordinate, location, quadrant, treasure) लौटाता है।
अगर निर्देशांक मेल नहीं खाते, तो एक खाली टपल लौटाइए। सटीक तुलना के लिए ज़रूरत के अनुसार निर्देशांकों का प्रारूप दोबारा बदलिए।
julia> create_record(("Brass Spyglass", "4B"), ("Abandoned Lighthouse", ('4', 'B'), "Blue"))
("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")
julia> create_record(("Brass Spyglass", "4B"), ("Seaside Cottages", ('1', 'C'), "Blue"))
()
Exercism पर साइन अप कीजिए और Julia को 35 कॉन्सेप्ट128 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।