सीलबंद लक्षण क्या है?


332

सीलबंद कक्षाएं 'स्कैला में प्रोग्रामिंग' में वर्णित हैं, लेकिन सील किए गए लक्षण नहीं हैं। मुझे सीलबंद विशेषता के बारे में और जानकारी कहां मिल सकती है?

मैं जानना चाहूंगा, यदि एक मुहरबंद विशेषता एक सील वर्ग के समान है? या, यदि नहीं, तो क्या अंतर हैं? सील किए गए विशेषता (और कब नहीं) का उपयोग करना एक अच्छा विचार है?

जवाबों:


472

एक sealedविशेषता को केवल उसी फ़ाइल में बढ़ाया जा सकता है, जब उसकी घोषणा होती है।

उनका उपयोग अक्सर एक विकल्प प्रदान करने के लिए किया जाता है enums। चूंकि उन्हें केवल एक फ़ाइल में बढ़ाया जा सकता है, इसलिए कंपाइलर हर संभव उपप्रकार जानता है और इसके बारे में तर्क कर सकता है।

उदाहरण के लिए घोषणा के साथ:

sealed trait Answer
case object Yes extends Answer
case object No extends Answer

कंपाइलर एक चेतावनी का उत्सर्जन करेगा यदि कोई मैच संपूर्ण नहीं है:

scala> val x: Answer = Yes
x: Answer = Yes

scala> x match {
     |   case No => println("No")
     | }
<console>:12: warning: match is not exhaustive!
missing combination            Yes

इसलिए आपको सीलबंद लक्षण (या सील किए गए सार वर्ग) का उपयोग करना चाहिए यदि संभव उपप्रकारों की संख्या परिमित और अग्रिम में ज्ञात है। अधिक उदाहरणों के लिए आप सूची और विकल्प कार्यान्वयन पर एक नज़र डाल सकते हैं ।


112
मुझे बेतरतीब ढंग से यहां पहुंचने और स्कैला में जावा एनम को बदलने का तरीका समझने में छह महीने लगे।
sscarduzio

बहुत अच्छा ! और न केवल अग्रिम और अग्रिम में जाना जाता है, बल्कि एक प्रतिबंधित (सीलबंद) संदर्भ का भी हिस्सा है, जहां सभी संभव उप-प्रकारों की जांच करने के लिए समझ में आता है जैसे हाँ | नहीं, यहां तक ​​कि | विषम आदि ...
मेरियो डे सा वेरा

90

एक मुहरबंद विशेषता एक सील वर्ग के समान है?

जहाँ तक sealedजाता है, हाँ। वे निश्चित रूप से traitऔर class, के बीच सामान्य अंतर साझा करते हैं ।

या, यदि नहीं, तो क्या अंतर हैं?

विवादास्पद।

सील किए गए विशेषता (और कब नहीं) का उपयोग करना एक अच्छा विचार है?

यदि आपके पास एक है sealed class X, तो आपको Xकिसी भी उपवर्ग के रूप में अच्छी तरह से जांचना होगा । वही सच नहीं है sealed abstract class Xया sealed trait X। तो आप कर सकते हैं sealed abstract class X, लेकिन इस तरह से अधिक क्रिया हैtrait और थोड़े से लाभ के लिए ।

abstract classओवर का उपयोग करने का मुख्य लाभ traitयह है कि यह पैरामीटर प्राप्त कर सकता है। प्रकार वर्ग का उपयोग करते समय यह लाभ विशेष रूप से प्रासंगिक है। उदाहरण के लिए, मान लीजिए कि आप सॉर्ट किए गए ट्री बनाना चाहते हैं। आप इसे लिख सकते हैं:

sealed abstract class Tree[T : Ordering]

लेकिन आप ऐसा नहीं कर सकते:

sealed trait Tree[T : Ordering]

चूंकि संदर्भ सीमा (और दृश्य सीमा) अंतर्निहित मापदंडों के साथ कार्यान्वित की जाती है। यह देखते हुए कि लक्षण मापदंडों को प्राप्त नहीं कर सकते, आप ऐसा नहीं कर सकते।

व्यक्तिगत रूप से, मैं sealed traitइसे पसंद करता हूं और इसका उपयोग करता हूं जब तक कि कोई विशेष कारण मुझे उपयोग नहीं करता है sealed abstract class। और मैं सूक्ष्म कारणों के बारे में बात नहीं कर रहा हूं, लेकिन आपके चेहरे के कारणों को आप अनदेखा नहीं कर सकते हैं, जैसे कि प्रकार की कक्षाओं का उपयोग करना।


"चूंकि संदर्भ सीमा (और दृश्य सीमा) अंतर्निहित मापदंडों के साथ कार्यान्वित की जाती है।" - क्या आप इसे विस्तार से समझा सकते हैं?
रूबी

@ रूबी - बहुत देर से जवाब, लेकिन मामले में आप या किसी और को दिलचस्पी है: संदर्भ बाउंडिंग ( [A: F]) वैरिएंट की कमी के समान काम नहीं करता है। बल्कि, यह सिंथेटिक चीनी है जो F[A]गुंजाइश में निहित की मांग करता है । यह आमतौर पर टाइपकास्ट उदाहरणों को एक तरह से बुलाने के लिए उपयोग किया जाता है जो कि थोड़े थोड़े होते हैं और एक अंतर्निहित पैरामीटर ( (implicit fa: F[A])) की तुलना में पढ़ने में आसान होते हैं , लेकिन यह अभी भी हुड के नीचे ठीक उसी तरह काम करता है, और जैसा कि डैनियल बताते हैं, लक्षण नहीं मिलते हैं उस।
मरिचन

54

से दैनिक-स्केला ब्लॉग :

जब कोई विशेषता "सील" की जाती है, तो उसके सभी उपवर्गों को एक ही फाइल के भीतर घोषित किया जाता है और इससे उपवर्गों के सेट को बारीक कर दिया जाता है जो कुछ संकलक जांच की अनुमति देता है।


धन्यवाद। "इसके सभी उपवर्गों" के साथ इसका अर्थ है वर्ग और लक्षण?
जॉन थ्रीपवुड

@ जॉन - मैंने कोशिश नहीं की है, लेकिन मुझे कक्षाओं पर संदेह है। सीलिंग के बारे में बात यह है कि सब कुछ उस एक स्रोत इकाई के भीतर परिभाषित किया गया है
ब्रायन एग्न्यू

1
@JohnThreepwood: कक्षाएं, लक्षण और वस्तुएं। ज्यादातर समय, स्काला में, "क्लास" शब्द का उपयोग वर्गों, लक्षणों और वस्तुओं को संदर्भित करने के लिए किया जाता है। केवल जब उनके बीच विशिष्ट अंतर के बारे में बात करते हैं, तो इसका मतलब केवल कक्षाएं हैं। एसएलएस शब्द "टेम्पलेट" का उपयोग वर्गों और लक्षणों दोनों को संदर्भित करने के लिए करता है, लेकिन उस शब्द का उपयोग एसएलएस के बाहर बहुत अधिक नहीं किया जाता है, और ऐसा कोई शब्द नहीं है जो सभी तीन वर्गों, लक्षणों और वस्तुओं को शामिल करता है।
जोर्ग डब्ल्यू मित्तग

30

इसके अलावा, मुझे आपको विशिष्टताओं की ओर संकेत करने की आवश्यकता है:

सील मोदी फाई एर वर्ग डी फाई nitions पर लागू होता है। एक सीलबंद वर्ग को सीधे विरासत में नहीं दिया जा सकता है, सिवाय इसके कि विरासत में मिला टेम्पलेट टेम्पलेट के रूप में उसी स्रोत फ़ाइल में ned है। हालांकि, एक सील वर्ग के उपवर्ग कहीं भी विरासत में मिल सकते हैं।

- एम। ओडस्की स्केल भाषा विनिर्देश, संस्करण 2.8। ऑनलाइन, सितंबर, 2013।


7

संक्षेप में:

  • सील किए गए लक्षणों को केवल उसी फ़ाइल में बढ़ाया जा सकता है
  • यह सूची संकलक को आसानी से सभी संभावित उपप्रकारों को जानने देती है
  • जब संभवत: उपप्रकारों की संख्या परिमित हो और अग्रिम रूप से ज्ञात हो तो सीलबंद लक्षणों का उपयोग करें
  • जावा में Enum जैसा कुछ बनाने का एक तरीका
  • बीजीय डेटा प्रकार (ADTs) को परिभाषित करने में मदद

और अधिक जानकारी के लिए स्काला में सील किए गए लक्षणों के बारे में सब कुछ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.