मान लें कि मैं एक साधारण टिक-टैक-टो खेल लिखने की कोशिश कर रहा हूं। इसमें एम एक्स एन फील्ड है। गेम में केवल एक फ़ील्ड है, इसलिए शायद इसे सिंगलटन object
के साथ प्रदर्शित किया जाना चाहिए। इस तरह:मैं ऑब्जेक्ट वैल्स को केवल रनटाइम पर ज्ञात मानों के साथ कैसे प्रारंभ करूं?
object Field {
val height : Int = 20
val width : Int = 15
...
}
लेकिन मैं ऊंचाई और चौड़ाई को हार्डकोड करने, तो यह अच्छा होगा अगर उन कार्यावधि में वस्तु के लिए पारित किया जा सकता है, एक निर्माता या कुछ और के माध्यम से नहीं करना चाहती। लेकिन object
एस में रचनाकार नहीं हो सकते हैं।
ठीक है, मैं height
और width
var
है, और नहीं val
रों होने के लिए बदल सकते हैं और एक नई पद्धति
def reconfigure (h:Int, w:Int) = {
height = h
width = w
}
लागू करने और यह खेल की शुरुआत में कह सकते हैं। लेकिन यह भी सुरुचिपूर्ण नहीं है।
तो, क्या ऐसा करने का एक साफ तरीका है - यानी ऑब्जेक्ट val
एस को रनटाइम से पहले ज्ञात मानों के साथ प्रारंभ किया गया है? है, तो जब तक आप उन्हें का उपयोग नहीं करते के रूप में जब तक आप सभी जानकारी आप उन्हें आरंभ करने की जरूरत है,
object Field {
lazy val height = // code to find height
lazy val width = // code to find width
}
वैल पहली बार यह प्रयोग किया जाता है initialised किया जाएगा:
ऐसा लगता है कि किसी भी समाधान को कहीं 'var' की आवश्यकता होगी। क्या आपने ऊंचाई और चौड़ाई कन्स्ट्रक्टर पैरामीटर वाले 'फ़ील्ड' को कक्षा बनाने पर विचार किया था? –
@ किपटन बरारोस मैंने किया। लेकिन मुझे उस वर्ग के केवल एक ही उदाहरण की आवश्यकता है। तो मैंने सोचा कि यह 'ऑब्जेक्ट' का उपयोग करने के लिए _ideologically_ बेहतर होगा। –