2012-01-08 18 views
14

मान लें कि मैं एक साधारण टिक-टैक-टो खेल लिखने की कोशिश कर रहा हूं। इसमें एम एक्स एन फील्ड है। गेम में केवल एक फ़ील्ड है, इसलिए शायद इसे सिंगलटन object के साथ प्रदर्शित किया जाना चाहिए। इस तरह:मैं ऑब्जेक्ट वैल्स को केवल रनटाइम पर ज्ञात मानों के साथ कैसे प्रारंभ करूं?

object Field { 
    val height : Int = 20 
    val width : Int = 15 
    ... 
} 

लेकिन मैं ऊंचाई और चौड़ाई को हार्डकोड करने, तो यह अच्छा होगा अगर उन कार्यावधि में वस्तु के लिए पारित किया जा सकता है, एक निर्माता या कुछ और के माध्यम से नहीं करना चाहती। लेकिन object एस में रचनाकार नहीं हो सकते हैं।

ठीक है, मैं height और widthvar है, और नहीं 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 किया जाएगा:

+0

ऐसा लगता है कि किसी भी समाधान को कहीं 'var' की आवश्यकता होगी। क्या आपने ऊंचाई और चौड़ाई कन्स्ट्रक्टर पैरामीटर वाले 'फ़ील्ड' को कक्षा बनाने पर विचार किया था? –

+0

@ किपटन बरारोस मैंने किया। लेकिन मुझे उस वर्ग के केवल एक ही उदाहरण की आवश्यकता है। तो मैंने सोचा कि यह 'ऑब्जेक्ट' का उपयोग करने के लिए _ideologically_ बेहतर होगा। –

उत्तर

15

क्यों main में एक class और प्रारंभ एक उदाहरण का उपयोग नहीं?

case class Field(width: Int, height: Int) { 
    //... 
} 

object Main { 
    def main(args: Array[String]): Unit = { 
    val field = Field(30, 25) 
    } 
} 
+0

क्योंकि यह सुरुचिपूर्ण नहीं है। एक कारण के लिए 'स्काला में ऑब्जेक्ट की शुरुआत की जानी चाहिए। अन्यथा, लोग वस्तुओं का उपयोग क्यों करेंगे? –

+5

@ सप्तमस केवल इसलिए कि सिंगलटन पैटर्न को डिज़ाइन पैटर्न कहा जाता है इसका मतलब यह नहीं है कि यह सुरुचिपूर्ण है और आपको इसका उपयोग करना चाहिए। मैं वस्तुओं का उपयोग कर रहा हूं और मैं उन्हें आपके उपयोग के मामले के लिए उपयोग नहीं करता। – ziggystar

+3

वर्ग का उपयोग निश्चित रूप से जाने का तरीका है। @SaptamusPrime यकीन नहीं है कि आप क्यों कहते हैं कि यह सुरुचिपूर्ण नहीं है। ओओ आर्किटेक्चर में आपके द्वारा वर्णित स्थिति मानक उपयोग केस है। आप उस स्थिति में ऑब्जेक्ट के उपयोग को मजबूर करने की कोशिश कर रहे हैं जहां यह फिट नहीं है। वस्तुओं को जावा में कक्षा के स्थिर भाग जैसे सभी उदाहरणों के लिए सामान्य सामान रखने के लिए, कक्षा के लिए साथी के रूप में उपयोग किया जाना है। यही कारण है कि उन्हें "साथी वस्तुओं" कहा जाता है। –

5

एक विकल्प आलसी Vals है आपको अच्छा होना चाहिए

+1

लेकिन यह अभी भी इस क्षेत्र को बाहर –

+0

से सेट करने का तरीका प्रदान नहीं करता है यह उत्तर बकवास है ... ऑब्जेक्ट्स को आलसी शुरू किया जाता है वैसे भी – lisak

13

आप आलसी vals के उपयोग को नियोजित कर सकते हैं। यह चीजों को और अधिक जटिल बना सकता है जिसे आपको अभी भी एक var का उपयोग करने की आवश्यकता है।

case class Config(height: Int, width: Int) 
object Field { 
    val defaultConfig = Config(20, 15) 
    var config: Option[Config] = None 
    def getConfig = config.getOrElse(defaultConfig) 
    lazy val height = getConfig.height 
    lazy val width = getConfig.width 
} 
object Main extends App { 
    Field.config = Some(Config(30, 25)) 
} 
+0

मुझे लगता है, मुझे विचार मिलता है। धन्यवाद! –

संबंधित मुद्दे

 संबंधित मुद्दे