क्लासें ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का एक केंद्रीय कॉन्सेप्ट हैं। Crystal में सब कुछ एक ऑब्जेक्ट है, हर ऑब्जेक्ट का अपना एक टाइप होता है, और वह कुछ मेथड का जवाब दे सकता है। क्लासें ऑब्जेक्ट बनाने के खाके होती हैं। ये स्थिति के लिए शुरुआती वैल्यू देती हैं, जैसे वेरिएबल, और व्यवहार का कार्यान्वयन देती हैं, जैसे मेथड। ऑब्जेक्ट क्लास के इंस्टेंस होते हैं, जो सारे इंस्टेंस वेरिएबल और स्थितियाँ अपने अंदर रखते हैं।
क्लास बनाने के लिए class कीवर्ड लिखा जाता है, और उसके बाद क्लास का नाम UpperCamelCase में लिखा जाता है।
class Account
end
क्लास का एक इंस्टेंस बनाने के लिए, new मेथड की मदद से क्लास के नाम को कॉल कीजिए।
class Account
end
account = Account.new
ऊपर के उदाहरण में वेरिएबल account क्लास Account का एक इंस्टेंस है।
इंस्टेंस बनाते समय, initialize नाम का एक खास मेथड कंस्ट्रक्टर का काम करता है।
यह तब कॉल किया जाता है जब कोई इंस्टेंस बनाया जाता है।
कंस्ट्रक्टर की मदद से आप इंस्टेंस की शुरुआती स्थिति तय कर सकते हैं।
initialize मेथड आर्गुमेंट ले सकता है, जो इंस्टेंस बनाते समय दिए जाते हैं।
class Account
def initialize(number)
5 + number # => 9
end
end
Account.new(4)
initialize मेथड खुद से कोई वैल्यू लौटा नहीं सकता; इसके बजाय, new नए बने इंस्टेंस को लौटाता है।
class Account
def initialize(number)
5 + number
end
end
Account.new(4)
# => #<Account:0x7f5dc33dcea0>
इंस्टेंस मेथड वह मेथड होता है जो क्लास के किसी इंस्टेंस के लिए उपलब्ध होता है, और उस इंस्टेंस पर कॉल किया जा सकता है।
इंस्टेंस मेथड बनाने के लिए def कीवर्ड लिखा जाता है, और उसके बाद मेथड का नाम।
ये मेथड क्लास की परिभाषा के अंदर बनाए जाते हैं।
class Account
def balance
100
end
end
account = Account.new
account.balance # => 100
इंस्टेंस वेरिएबल ऐसे वेरिएबल होते हैं जो इंस्टेंस के सारे मेथड में उपलब्ध होते हैं।
किसी इंस्टेंस वेरिएबल तक पहुँचने के लिए आपको एक इंस्टेंस मेथड बनाना होता है।
इन वेरिएबल को initialize मेथड में शुरुआती वैल्यू दी जा सकती है।
इन्हें @ प्रीफिक्स लगाकर बनाया जाता है।
class Account
def initialize
@balance = 100
end
def balance
@balance
end
end
account = Account.new
account.balance
# => 100
इंस्टेंस वेरिएबल क्लास की परिभाषा के अंदर भी बनाए जा सकते हैं।
class Account
@age = 0
end
इंस्टेंस वेरिएबल को initialize मेथड में दिए गए आर्गुमेंट से शुरुआती वैल्यू दी जा सकती है।
चूँकि Crystal शुरुआती वैल्यू देते समय इस्तेमाल हुए आर्गुमेंट का टाइप खुद से नहीं पहचान सकता, इसलिए टाइप बताना ज़रूरी होता है।
अगर आप इसके बारे में और पढ़ना चाहते हैं, तो टाइप इन्फरेंस पढ़ सकते हैं।
वेरिएबल का टाइप बताने के लिए आप : चिह्न का इस्तेमाल कर सकते हैं, और उसके बाद टाइप लिख सकते हैं।
उदाहरण के लिए, अगर आप Int32 टाइप का balance नाम का इंस्टेंस वेरिएबल बनाना चाहते हैं, तो आप ऐसा कर सकते हैं: @balance : Int32.
या अगर आप Bool टाइप का raining नाम का इंस्टेंस वेरिएबल बनाना चाहते हैं, तो आप ऐसा कर सकते हैं: @raining : Bool.
इसे लागू करने के कुछ तरीके हैं। एक तरीका यह है कि initialize मेथड में आर्गुमेंट के साथ उसका टाइप लिखा जाए, और फिर उस आर्गुमेंट को इंस्टेंस वेरिएबल में असाइन किया जाए, जैसा नीचे के उदाहरण में है:
class Account
def initialize(balance : Int32)
@balance = balance
end
def balance
@balance
end
end
account = Account.new(1)
account_2 = Account.new(5)
account.balance
# => 1
account_2.balance
# => 5
दूसरा तरीका यह है कि क्लास की परिभाषा में इंस्टेंस वेरिएबल का टाइप इस रूप में लिखा जाए: @<variable> : <Type>, जैसा नीचे के उदाहरण में है:
class Weather
@raining : Bool
def initialize(raining)
@raining = raining
end
def raining
@raining
end
end
weather = Weather.new(true)
weather.raining
# => true
मेथड इंस्टेंस वेरिएबल बदल सकते हैं। इन मेथड को क्लास के इंस्टेंस पर कॉल किया जा सकता है। जब कोई मेथड किसी इंस्टेंस वेरिएबल को बदलता है, तो वह बदलाव सिर्फ उसी इंस्टेंस में दिखता है जिस पर आपने वह मेथड कॉल किया था।
class Account
def initialize(balance : Int32)
@balance = balance
end
def withdraw(amount)
@balance -= amount
end
def balance
@balance
end
end
account = Account.new(10)
account_2 = Account.new(10)
account.balance
# => 10
account_2.balance
# => 10
account.withdraw(5)
account.balance
# => 5
account_2.balance
# => 10
क्लास मेथड ऐसे मेथड होते हैं जो क्लास के लिए बनाए जाते हैं, उसके इंस्टेंस के लिए नहीं।
ये ऐसे मेथड बनाने का तरीका देते हैं जो इंस्टेंस की स्थिति पर निर्भर नहीं होते।
इन्हें def कीवर्ड से बनाया जाता है, और उसके बाद self.<method name> लिखा जाता है।
self उस नेमस्पेस का संदर्भ है जहाँ से self को कॉल किया जा रहा है।
इस मामले में, यह क्लास Account को दर्शाता है।
यह वैसा ही होगा जैसे आपने Account. लिखा हो, लेकिन self. ज़्यादा पसंद किया जाता है।
class Account
def self.balance
100
end
end
Account.balance
# => 100
आपके दोस्त Johannes को DIY (खुद करने वाला) हार्डवेयर बनाना बहुत पसंद है। उन्होंने अभी-अभी एक जूस मेकर बनाया है, और Johannes इससे बहुत उत्साहित हैं। Johannes का लक्ष्य हर सुबह ताज़ा जूस बनाना है।
Johannes जूस मेकर में कई बढ़िया फीचर हैं। जैसे कि अंदर लगा एक मापने वाला सिस्टम, जो बता सकता है कि कप में कितना जूस है। इसमें एक टाइमर भी है, जो बताता है कि मशीन कितनी देर से चल रही है।
Johannes प्रोग्रामिंग में बहुत अच्छे नहीं हैं, लेकिन वे मशीन को नियंत्रित करने के लिए एक प्रोग्राम बनाना चाहते हैं। इसलिए उन्होंने आपसे मदद माँगी है।
मशीन में एक डीबग लाइट है। यह एक साधारण तंत्र है: अगर मशीन में बिजली है, तो डीबग लाइट जलती है। प्रोग्राम तभी चलता है जब डीबग लाइट जल रही हो।
यह मेथड JuiceMaker नाम का क्लास मेथड होना चाहिए।
क्लास मेथड JuiceMaker.debug_light_on? बनाइए, जो true लौटाता है।
JuiceMaker.debug_light_on?
#=> true
मशीन चालू होने पर उसे JuiceMaker नाम की क्लास का एक इंस्टेंस बनाना चाहिए।
मशीन की एक शुरुआती स्थिति होनी चाहिए।
शुरुआती स्थिति में ये जानकारियाँ होनी चाहिए:
false होना चाहिए।शुरुआती स्थिति को परिभाषित कीजिए। यह कप में जूस की मात्रा को पैरामीटर के रूप में लेती है। अब इस शुरुआती स्थिति को बनाइए।
शुरुआती स्थिति में एक इंस्टेंस वेरिएबल @running होना चाहिए, जिसकी वैल्यू false रखी जाती है, और एक इंस्टेंस वेरिएबल @fluid होना चाहिए, जिसकी वैल्यू क्लास बनाते समय दिए गए आर्गुमेंट के आधार पर तय होती है।
JuiceMaker.new(5)
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=5>
मशीन को चालू और बंद किया जा सकता है।
मशीन चालू करने के लिए आपको एक मेथड बनाना है।
मशीन चालू होने पर उसकी चलने की स्थिति true होनी चाहिए।
मशीन चालू करने वाला मेथड JuiceMaker#start बनाइए।
juice_maker = JuiceMaker.new(5)
juice_maker.start
juice_maker
#=> #<JuiceMaker:0x10f0b8 @running=true, @fluid=5>
मशीन को अपनी स्थिति बताने में सक्षम होना चाहिए।
अगर मशीन चल रही है तो इसे true लौटाना चाहिए, और अगर मशीन नहीं चल रही है तो false लौटाना चाहिए।
मशीन की स्थिति लौटाने वाला मेथड JuiceMaker#running? बनाइए।
juice_maker = JuiceMaker.new(5)
juice_maker.start
juice_maker.running?
#=> true
मशीन कप में जूस जोड़ सकती है। मशीन बता सकती है कि कप में कितना जूस जोड़ा गया। जूस जोड़ने के बाद कप में कितना जूस है, यह जानने के लिए मशीन को मदद चाहिए।
मेथड JuiceMaker#add_fluid बनाइए, जो जोड़े गए जूस की मात्रा को पैरामीटर के रूप में लेता है और कप में जूस की मात्रा बदल देता है।
juice_maker = JuiceMaker.new(5)
juice_maker.add_fluid(5)
juice_maker
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=10>
मशीन को चालू और बंद किया जा सकता है।
मशीन बंद करने के लिए आपको एक मेथड बनाना है।
इस मेथड को सिर्फ तब कॉल किया जाएगा, जब मशीन चल रही हो।
मशीन बंद होने पर उसकी चलने की स्थिति false होनी चाहिए।
मशीन बंद होने के बाद कप में कितना जूस है, यह पता लगाने में भी मशीन को मदद चाहिए।
मशीन हर मिनट पाँच यूनिट जूस खर्च करती है।
मेथड JuiceMaker#stop बनाइए, जो मशीन के चलने के मिनटों की संख्या को पैरामीटर के रूप में लेता है और मशीन बंद होने के बाद कप में बचे जूस की मात्रा लौटाता है।
juice_maker = JuiceMaker.new(5)
juice_maker.start
juice_maker
#=> <JuiceMaker:0x10f0b8 @running=true, @fluid=5>
juice_maker.stop(1)
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=0>
Exercism पर साइन अप कीजिए और Crystal को 26 कॉन्सेप्ट142 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।