गेटर और सेटर ऐसे मेथड हैं जिनकी मदद से आप किसी ऑब्जेक्ट की प्रॉपर्टी की वैल्यू पढ़ और लिख सकते हैं। Crystal में मैक्रो होते हैं, जिनसे किसी प्रॉपर्टी के लिए गेटर और सेटर बनाना आसान हो जाता है। मैक्रो कंपाइल के समय कोड बनाने का तरीका हैं, जिसके बारे में आगे मैक्रो कॉन्सेप्ट में बताया जाएगा।
Ruby में ये मेथड attr_reader, attr_writer और attr_accessor मेथड से बनाए जाते हैं, और ऊपर से देखने पर Crystal के तरीके से काफी मिलते-जुलते हैं।
Crystal ने इन्हें getter, setter और property मैक्रो के रूप में बनाया है।
गेटर एक मैक्रो है जो एक ऐसा मेथड बनाता है जो इंस्टेंस वेरिएबल की वैल्यू लौटाता है।
इसका मतलब है कि जब आपको उस इंस्टेंस वेरिएबल की वैल्यू चाहिए (मेथड के अंदर, initialize को छोड़कर), तो अब आपको उसके आगे @ लिखने की ज़रूरत नहीं है; उसके बजाय आप वह मेथड कॉल कर सकते हैं जिसे गेटर मैक्रो ने बनाया है।
गेटर मैक्रो एक से ज़्यादा इंस्टेंस वेरिएबल भी ले सकता है, बस उनके बीच कॉमा लगाइए।
# This:
class Person
@name : String
@age : Int32
def name
@name
end
def age
@age
end
end
# Is the same as this:
class Person
@name : String
@age : Int32
getter name, :age
end
जैसा कि आप देख सकते हैं, गेटर इस्तेमाल करने से आपका लिखा कोड कम हो जाता है और पढ़ने में भी आसानी होती है। साथ ही, Ruby और Crystal में यह अंतर भी है कि Crystal गेटर मैक्रो के आर्गुमेंट के तौर पर वेरिएबल का नाम और सिंबल, दोनों लेता है। सिंबल के बारे में आगे सिंबल कॉन्सेप्ट में बताया जाएगा।
सेटर एक मैक्रो है जो एक ऐसा मेथड बनाता है जो इंस्टेंस वेरिएबल की वैल्यू सेट करता है।
यह मैक्रो ज़्यादा नहीं दिखता; आम तौर पर इसकी जगह property मैक्रो इस्तेमाल किया जाता है।
जो मेथड बनेंगे वे name_of_method= जैसे दिखेंगे; यही = है जिसकी वजह से प्रॉपर्टी सेट की जा सकती है।
इस मेथड की परिभाषा थोड़ी खास है, क्योंकि मेथड जो आर्गुमेंट लेता है वह = चिह्न के बाद आता है।
Crystal में और भी कई खास मेथड इसी सिंटैक्स का इस्तेमाल करते हैं, जैसे + मेथड।
गेटर मैक्रो की तरह ही, सेटर बनाने के बाद जब आप इंस्टेंस वेरिएबल की वैल्यू बदलना चाहते हैं, तो आप वह मेथड कॉल कर सकते हैं जिसे सेटर मैक्रो ने बनाया है।
# This:
class Person
@name : String
@age : Int32
def name=(name : String)
@name = name
end
def age=(age : Int32)
@age = age
end
end
# Is the same as this:
class Person
@name : String
@age : Int32
setter name, :age
end
प्रॉपर्टी एक ऐसा मैक्रो है जो किसी इंस्टेंस वेरिएबल के लिए गेटर और सेटर, दोनों बनाता है।
class Person
@name : String
@age : Int32
property name, :age
end
इस अभ्यास में आप एक वज़न करने वाली मशीन का मॉडल बनाएँगे।
जब मशीन इनिशियलाइज़ होती है, तो उसे अपनी फैक्ट्री सेटिंग्स का इस्तेमाल करना चाहिए। ये सेटिंग्स इस बात पर निर्भर करती हैं कि मशीन कहाँ बेची जाती है। इसलिए मशीन को इनिशियलाइज़ करते समय सटीकता दी जा सकती है, और यह भी बताया जा सकता है कि वह मीट्रिक प्रणाली इस्तेमाल करेगी या इम्पीरियल प्रणाली।
WeighingMachine#initialize मेथड बनाइए, जो दो आर्गुमेंट लेता है: precision, जो एक Int32 है, और metric, जो एक Bool है। metric आर्गुमेंट के true होने का मतलब है कि मशीन को मीट्रिक प्रणाली इस्तेमाल करनी चाहिए, वरना उसे इम्पीरियल प्रणाली इस्तेमाल करनी चाहिए। इनिशियलाइज़ मेथड को इंस्टेंस वेरिएबल @weight पर 0.0 सेट करना भी चाहिए।
precision = 3
metric = true
vm = WeighingMachine.new(precision, metric)
अलग-अलग ज़रूरतों को पूरा करने के लिए हम हर मशीन में सटीकता सेट कर सकते हैं (यानी दशमलव चिह्न के बाद आने वाले अंकों की संख्या)।
WeighingMachine#precision गेटर मेथड बनाइए, जो मशीन की सटीकता लौटाता है।
precision = 3
metric = true
vm = WeighingMachine.new(precision, metric)
vm.precision
# => 3
WeighingMachine#weight प्रॉपर्टी बनाइए, ताकि वज़न पढ़ा भी जा सके और सेट भी किया जा सके:
precision = 3
metric = true
wm = WeighingMachine.new(precision, metric)
wm.weight = 60.5
wm.weight
# => 60.5
wm.weigh
# => 60.5
WeighingMachine#metric= प्रॉपर्टी बनाइए, जिससे इकाई सेट की जा सके। इसे एक बूलियन वैल्यू स्वीकार करनी चाहिए।
precision = 3
metric = true
wm = WeighingMachine.new(precision, metric)
vm.weight = 60.5
wm.metric = false
vm.weigh
# => 133.377
Exercism पर साइन अप कीजिए और Crystal को 26 कॉन्सेप्ट142 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।