2012-06-16 13 views
120

मुझे कहना है कि मुझे स्कैला गणना कक्षाएं नहीं समझती हैं। मैं प्रलेखन से उदाहरण को कॉपी-पेस्ट कर सकता हूं, लेकिन मुझे नहीं पता कि क्या हो रहा है।स्कैला गणनाओं को समझना

object WeekDay extends Enumeration { 
    type WeekDay = Value 
    val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value 
} 
import WeekDay._ 
  • type WeekDay = Value क्या मतलब है और क्यों मुझे लगता है कि लिखने के लिए क्या है?
  • val Mon = Value क्यों है? उस समतल का क्या मतलब है?
  • मुझे WeekDay ऑब्जेक्ट आयात क्यों करना है? और,
  • जब मैं val day = WeekDay.Mon लिखता हूं, तो यह WeekDay.Value टाइप क्यों है, WeekDay टाइप करें?
+2

मैंने स्केल गणना और विकल्पों के बारे में एक छोटा सा अवलोकन लिखा है, तो आप इसे उपयोगी पा सकते हैं: pedrorijo.com/blog/scala-enums/ – pedrorijo91

उत्तर

149

Enumeration विशेषता एक प्रकार सदस्य Value गणन के व्यक्तिगत तत्वों का प्रतिनिधित्व (यह वास्तव में एक आंतरिक वर्ग है, लेकिन अंतर बात यहाँ नहीं है) है।

इस प्रकार object WeekDay सदस्य टाइप करते हैं। लाइन type WeekDay = Value सिर्फ टाइप उपनाम है। यह उपयोगी है, क्योंकि तुम्हारे जाने के बाद import WeekDay._ साथ कहीं और यह आयात करते हैं तो उस प्रकार, जैसे उपयोग कर सकते हैं:

def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun) 

इसके बजाय, एक न्यूनतम संस्करण सिर्फ होगा:

object WeekDay extends Enumeration { 
    val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value 
} 

और आप नहीं हैobject WeekDay की सामग्री आयात करें, लेकिन फिर आपको WeekDay.Value टाइप करने और व्यक्तिगत सदस्यों को अर्हता प्राप्त करने की आवश्यकता होगी। इसलिए उदाहरण बन जाएगा

def isWorkingDay(d: WeekDay.Value) = ! (d == WeekDay.Sat || d == WeekDay.Sun) 

दूसरा सवाल val Mon, ... = Value के अर्थ के बारे में है। यदि आप Enumeration के कार्यान्वयन को नहीं देखते हैं तो यह वास्तव में बहुत भ्रमित है। यह एक प्रकार का असाइनमेंट नहीं है! यह एक ही नाम, Value की एक सुरक्षित विधि को कॉल करने के बजाय है, जो Value प्रकार का ठोस उदाहरण देता है।

यह इतना है कि आप स्काला में val a, b, c = foo लिख सकते हैं, और प्रत्येक मान a, b, और c विधि के लिए foo बार-बार बुलाया जाएगा। Enumeration एक आंतरिक काउंटर को बढ़ाने के लिए इस चाल का उपयोग करता है ताकि प्रत्येक मान व्यक्तिगत हो।

यदि आप Enumeration के लिए स्कैला एपीआई दस्तावेज़ खोलते हैं और Visibility: All पर क्लिक करते हैं, तो आप उस विधि को प्रदर्शित करेंगे।

+2

धन्यवाद, यह बहुत भ्रमित है लेकिन मुझे लगता है कि यह सही है। मैं इसके बजाय मुहरबंद केस कक्षाओं का उपयोग करूंगा, ऐसा लगता है कि यह 100% आसान है। –

+2

मैं व्यक्तिगत रूप से मुहरबंद केस कक्षाओं को भी पसंद करता हूं। थोड़ी अधिक वर्बोज़, लेकिन परिवर्तनीय आंतरिक काउंटरों के साथ कम होकस-पोकस और बहुत आगे। स्कैला 2.10 के साथ, कुछ विचार हैं कि कैसे जावा (जावा के विपरीत एक भाषा निर्माण नहीं है बल्कि सिर्फ एक पुस्तकालय समाधान है) मैक्रोज़ का उपयोग करके बेहतर लिखा जा सकता है। –

+0

@ 0__ मई मैं पूछ सकता हूं कि स्केल में एनम को बदलने के लिए आप क्यों और कैसे सीलबंद कक्षा का उपयोग करते हैं? क्या स्कैला के गणन के साथ कुछ गड़बड़ है? – x1a0

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