स्काला एन्यूमरेशन्स को समझना


122

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

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

सील लक्षण एक उत्कृष्ट विकल्प प्रदान करते हैं - stackoverflow.com/questions/11203268/what-is-a-sealed-trait
जॉय बरुच

जवाबों:


150

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

क्या होगा यदि Enum मानों में स्वयं सदस्य हैं? उदाहरण के लिए आप सप्ताह के प्रत्येक दिन के लिए खुलने का समय कैसे निर्धारित करेंगे जैसे: सोम (8,20), ..., सूर्य (0,0)?
सिमोउ

1
@simou तो आप वास्तव में एक मुहरबंद विशेषता और वास्तविक उप वर्गों का उपयोग करना चाहिए। मैं शायद ही उस परिदृश्य को "गणना" कहूंगा। आप बेहतर लिख सकते हैं Open(Mon, 8, 20)और दिन एक समतल वातावरण में रहेंगे।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.