ट्रैक
/
Go
Go
/
अभ्यास
/
Jedlik के खिलौने
Jedlik के खिलौने

Jedlik के खिलौने

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

परिचय

मेथड एक ऐसा फंक्शन होता है जिसमें एक खास रिसीवर आर्गुमेंट होता है। रिसीवर अपनी अलग आर्गुमेंट लिस्ट में func कीवर्ड और मेथड के नाम के बीच आता है।

func (receiver type) MethodName(parameters) (returnTypes) {
}

आप ऐसा मेथड ही बना सकते हैं जिसका रिसीवर ऐसे टाइप का हो जो मेथड वाले ही पैकेज में परिभाषित हो।

package person 

type Person struct {
	Name string
}

func (p Person) Greetings() string {
	return fmt.Sprintf("Welcome %s!", p.Name)
}

स्ट्रक्ट पर बने मेथड को डॉट नोटेशन से कॉल किया जा सकता है।

p := Person{Name: "Bronson"}
fmt.Println(p.Greetings())
// Output: Welcome Bronson!

ध्यान दीजिए कि हमने Person इंस्टेंस p पर Greetings() मेथड कैसे कॉल किया। यह बिल्कुल वैसे ही है जैसे आप किसी ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषा में मेथड कॉल करते हैं।

याद रखिए: मेथड बस एक रिसीवर आर्गुमेंट वाला फंक्शन ही है। मेथड नामों के टकराव से बचने में मदद करते हैं। चूँकि मेथड किसी एक खास रिसीवर टाइप से जुड़ा होता है, इसलिए अलग-अलग टाइप पर एक ही मेथड नाम रखा जा सकता है।

import "math"

type rect struct {
	width, height int
}
func (r rect) area() int {
	return r.width * r.height
}

type circle struct {
	radius int
}
func (c circle) area() float64 {
	return math.Pow(float64(c.radius), 2) * math.Pi
}

रिसीवर दो तरह के होते हैं: वैल्यू रिसीवर और पॉइंटर रिसीवर।

अब तक हमने जो भी मेथड देखे, वे सब वैल्यू रिसीवर वाले थे। इसका मतलब है कि उन्हें मेथड को दी गई वैल्यू की एक कॉपी मिलती है, यानी मेथड के अंदर रिसीवर में किया गया कोई भी बदलाव कॉल करने वाले को दिखाई नहीं देता।

रिसीवर जिस वैल्यू की ओर इशारा करता है उसे बदलने के लिए आप पॉइंटर रिसीवर वाले मेथड घोषित कर सकते हैं। इसके लिए टाइप के नाम से पहले एक * लगाया जाता है। जैसे rect टाइप के लिए पॉइंटर रिसीवर *rect घोषित किया जाएगा। ऐसे बदलाव मेथड को कॉल करने वाले को भी दिखाई देते हैं।

type rect struct {
	width, height int
}
func (r *rect) squareIt() {
	r.height = r.width
}

r := rect{width: 10, height: 20}
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 20

r.squareIt()
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 10

निर्देश

ध्यान दें: यह अभ्यास need-for-speed अभ्यास की अगली कड़ी है।

इस अभ्यास में आप कई तरह की रिमोट कंट्रोल कारों के बीच दौड़ का आयोजन करेंगे। हर कार की गति और बैटरी ड्रेन अलग-अलग होते हैं।

कारें पूरी (100%) बैटरी के साथ शुरू होती हैं। जब भी आप रिमोट कंट्रोल से कार चलाते हैं, कार अपनी गति के बराबर मीटर तय करती है और बची हुई बैटरी का प्रतिशत अपने बैटरी ड्रेन के बराबर घटा देती है।

अगर कार की बैटरी उसके बैटरी ड्रेन प्रतिशत से कम हो, तो आप उस कार को और नहीं चला सकते।

रिमोट कंट्रोल कार में एक शानदार LED डिस्प्ले है जो दो तरह की जानकारी दिखाता है:

  • अब तक तय की गई कुल दूरी, जो इस तरह दिखाई जाती है: "Driven <METERS> meters".
  • बची हुई बैटरी चार्ज, जो इस तरह दिखाई जाती है: "Battery at <PERCENTAGE>%".

हर दौड़ के ट्रैक की अपनी दूरी होती है। कारों की जाँच यह देखकर की जाती है कि वे बैटरी खत्म हुए बिना ट्रैक पूरा कर पाती हैं या नहीं।

1. कार चलाइए

Car पर Drive मेथड बनाइए, जो कार की गति के अनुसार तय किए गए मीटर की संख्या बदलता है और बैटरी ड्रेन के अनुसार बैटरी घटाता है:

speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)
car.Drive()
// car is now Car{speed: 5, batteryDrain: 2, battery: 98, distance: 5}

ध्यान दें: अगर कार चलाने से उसकी बैटरी 0 से नीचे चली जाए, तो आपको कार चलाने की कोशिश नहीं करनी चाहिए।

2. तय की गई दूरी प्रदर्शित कीजिए

Car पर एक DisplayDistance मेथड बनाइए जो LED डिस्प्ले पर दिखाई जाने वाली दूरी को string के रूप में लौटाता है:

speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)

fmt.Println(car.DisplayDistance())
// Output: "Driven 0 meters"

3. बैटरी प्रतिशत प्रदर्शित कीजिए

Car पर DisplayBattery मेथड बनाइए जो LED डिस्प्ले पर दिखाए जाने वाले बैटरी प्रतिशत को string के रूप में लौटाता है:

speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)

fmt.Println(car.DisplayBattery())
// Output: "Battery at 100%"

4. जाँचिए कि रिमोट कंट्रोल कार कोई दौड़ पूरी कर सकती है या नहीं

किसी दौड़ को पूरा करने के लिए कार को दौड़ की दूरी तय करनी होती है। इसका मतलब है कि फिनिश लाइन पार करने से पहले कार की बैटरी खत्म नहीं होनी चाहिए। CanFinish मेथड बनाइए जो अपने पैरामीटर के रूप में trackDistance int लेता है और अगर कार दौड़ पूरी कर सकती है तो true लौटाता है, वरना false लौटाता है:

speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)

trackDistance := 100

car.CanFinish(trackDistance)
// => true
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Go Exercism

Jedlik के खिलौने शुरू करने के लिए तैयार हैं?

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