ट्रैक
/
Crystal
Crystal
/
अभ्यास
/
Johannes का जूस मेकर
Johannes का जूस मेकर

Johannes का जूस मेकर

सीखने का अभ्यास

परिचय

क्लासें ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का एक केंद्रीय कॉन्सेप्ट हैं। 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)
Note

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 प्रोग्रामिंग में बहुत अच्छे नहीं हैं, लेकिन वे मशीन को नियंत्रित करने के लिए एक प्रोग्राम बनाना चाहते हैं। इसलिए उन्होंने आपसे मदद माँगी है।

1. डीबग लाइट

मशीन में एक डीबग लाइट है। यह एक साधारण तंत्र है: अगर मशीन में बिजली है, तो डीबग लाइट जलती है। प्रोग्राम तभी चलता है जब डीबग लाइट जल रही हो।

यह मेथड JuiceMaker नाम का क्लास मेथड होना चाहिए।

क्लास मेथड JuiceMaker.debug_light_on? बनाइए, जो true लौटाता है।

JuiceMaker.debug_light_on?
#=> true

2. मशीन की शुरुआती स्थिति बनाइए

मशीन चालू होने पर उसे JuiceMaker नाम की क्लास का एक इंस्टेंस बनाना चाहिए। मशीन की एक शुरुआती स्थिति होनी चाहिए। शुरुआती स्थिति में ये जानकारियाँ होनी चाहिए:

  1. मशीन चल रही है या नहीं। मशीन चालू होने पर यह हमेशा false होना चाहिए।
  2. कप में जूस की मात्रा। यह एक सेंसर होगा, जो कप में जूस की मात्रा नापेगा।

शुरुआती स्थिति को परिभाषित कीजिए। यह कप में जूस की मात्रा को पैरामीटर के रूप में लेती है। अब इस शुरुआती स्थिति को बनाइए। शुरुआती स्थिति में एक इंस्टेंस वेरिएबल @running होना चाहिए, जिसकी वैल्यू false रखी जाती है, और एक इंस्टेंस वेरिएबल @fluid होना चाहिए, जिसकी वैल्यू क्लास बनाते समय दिए गए आर्गुमेंट के आधार पर तय होती है।

JuiceMaker.new(5)
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=5>

3. मशीन चालू कीजिए

मशीन को चालू और बंद किया जा सकता है। मशीन चालू करने के लिए आपको एक मेथड बनाना है। मशीन चालू होने पर उसकी चलने की स्थिति true होनी चाहिए।

मशीन चालू करने वाला मेथड JuiceMaker#start बनाइए।

juice_maker = JuiceMaker.new(5)
juice_maker.start

juice_maker
#=> #<JuiceMaker:0x10f0b8 @running=true, @fluid=5>

4. मशीन की स्थिति

मशीन को अपनी स्थिति बताने में सक्षम होना चाहिए। अगर मशीन चल रही है तो इसे true लौटाना चाहिए, और अगर मशीन नहीं चल रही है तो false लौटाना चाहिए।

मशीन की स्थिति लौटाने वाला मेथड JuiceMaker#running? बनाइए।

juice_maker = JuiceMaker.new(5)
juice_maker.start

juice_maker.running?
#=> true

5. जूस जोड़िए

मशीन कप में जूस जोड़ सकती है। मशीन बता सकती है कि कप में कितना जूस जोड़ा गया। जूस जोड़ने के बाद कप में कितना जूस है, यह जानने के लिए मशीन को मदद चाहिए।

मेथड JuiceMaker#add_fluid बनाइए, जो जोड़े गए जूस की मात्रा को पैरामीटर के रूप में लेता है और कप में जूस की मात्रा बदल देता है।

juice_maker = JuiceMaker.new(5)
juice_maker.add_fluid(5)

juice_maker
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=10>

6. मशीन बंद कीजिए

मशीन को चालू और बंद किया जा सकता है। मशीन बंद करने के लिए आपको एक मेथड बनाना है। इस मेथड को सिर्फ तब कॉल किया जाएगा, जब मशीन चल रही हो। मशीन बंद होने पर उसकी चलने की स्थिति 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>
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Crystal Exercism

Johannes का जूस मेकर शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Crystal को 26 कॉन्सेप्ट142 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।