में exhaustiveness चेकों संरक्षण एक्सट्रैक्टर्स के साथ मामला वर्ग विरासत की जगह मैं एक साधारण वर्ग पदानुक्रम उस के साथ vertexes के कई अलग-अलग प्रकार के मामले वर्गों का उपयोग करना कार्यान्वित एक ग्राफ की तरह संरचना का प्रतिनिधित्व करता है:स्काला
sealed trait Node
sealed abstract case class Vertex extends Node
case class Arc extends Node
case class VertexType1 (val a:Int) extends Vertex
case class VertexType2 (val b:Int) extends Vertex
यह मैं लिखने की अनुमति देता इस तरह मैच ब्लॉक:
def test (x: Node) = x match {
case _ : Arc => "got arc"
case _ : Vertex => "got vertex"
}
या इस तरह:
def test (x: Node) = x match {
case _ : Arc => "got arc"
case c : Vertex => c match {
case _ : VertexType1(a) => "got type 1 vertex " + a
case _ : VertexType2(a) => "got type 2 vertex " + a
}
}
ध्यान दें कि इस कार्यान्वयन में निम्न गुण हैं:
1) यह मिलान ब्लॉक को लिखने की अनुमति देता है जो आर्क और लंबवत के बीच अंतर करता है, लेकिन विशिष्ट वर्टेक्स प्रकारों के बीच नहीं, बल्कि ब्लैक मिलान प्रकारों के बीच भिन्नता से मेल खाता है।
2) दोनों चरम-प्रकार-विशिष्ट और गैर-वर्टेक्स-प्रकार-विशिष्ट मिलान ब्लॉक में पैटर्न मिलान की थकावट की जांच की जाती है।
हालांकि, केस कक्षाओं से विरासत को बहिष्कृत किया गया है, और संकलक गैर-पत्ती नोड्स (यानी, ऊपर दिए गए उदाहरण में, आर्क और शिखर के बीच अंतर करने के लिए, लेकिन वर्टेक्स प्रकारों के बीच अंतर करने के लिए) के बजाय निकालने वाले का उपयोग करने का सुझाव देता है। ।
प्रश्न: क्या केस क्लास विरासत का उपयोग किए बिना एक समान श्रेणी पदानुक्रम को कार्यान्वित करना संभव है, लेकिन अभी भी ऊपर दिखाए गए दोनों उपयोग मामलों में कंपाइलर द्वारा किए गए पैटर्न थकाऊपन जांच हैं?
EDIT: मैंने VertexType कक्षाओं में एक कन्स्ट्रक्टर पैरामीटर जोड़ा है ताकि मैच केवल प्रकारों पर नहीं किया जा सके।
sealed trait Node
sealed abstract class Vertex extends Node
class Arc extends Node
class VertexType1 (val a:Int) extends Vertex
class VertexType2 (val b:Int) extends Vertex
object VertexType1 {
def unapply (x : VertexType1) : Some[Int] = Some(x.a)
}
object VertexType2 {
def unapply (x : VertexType2) : Some[Int] = Some(x.b)
}
और परीक्षण कोड:
मामले वर्गों के बिना मेरे वर्तमान कार्यान्वयन इस प्रकार है
def test (x: Node) = x match {
case _ : Arc => "got arc"
case v : Vertex => v match {
case VertexType1(a) => "got vertex type 1 " + a
}
}
मैं दूसरे खंड में गैर संपूर्ण मैच बारे में एक चेतावनी की उम्मीद (VertexType2 है कभी मेल नहीं खाता), लेकिन कोई नहीं है।
दरअसल, 2.9.0-आरसी 3 से पहले स्कैला कंपाइलर्स एक चेतावनी उत्पन्न करते हैं जो मुझे देखने की उम्मीद है, लेकिन आरसी 3 (2.9.0 और 2.9.0-1 समेत) से शुरू होने वाले संस्करण, जो भ्रमित नहीं हैं।
बस पूर्णता के लिए: यह स्कैला 2.10 में तय किया गया है। (स्कैला 2.9.एक्स में एक रिग्रेशन था) – gourlaysama