मैं आरईएसटी एपीआई से प्रतिक्रियाओं को मॉडल करने का प्रयास कर रहा हूं क्योंकि कक्षाओं के साथ मैं पैटर्न मिलान का उपयोग कर सकता हूं।स्कैला केस क्लास के साथ मॉडलिंग
मैंने सोचा कि यह विरासत मानने के लिए एक अच्छा फिट होगा, लेकिन मुझे लगता है कि यह बहिष्कृत है। मुझे पता है कि केस कक्षाओं और विरासत से संबंधित प्रश्न पहले से ही हैं, लेकिन मेरा प्रश्न इस बारे में अधिक है कि आप के बिना विरासत के "सही तरीके" का मॉडल कैसे करेंगे। से REST कॉल यानी
case class Body(contentType: String, content: String)
case class Response(statusCode: Int, body: Body)
की तरह कुछ के साथ वापसी होगी:
Response(200, Body("application/json", """{ "foo": "bar" }"""))
जो मैं कर सकता पैटर्न मैच की तरह:
मैं निम्नलिखित दो मामले कक्षाएं, जो ठीक से काम के साथ शुरू
response match {
case Response(200, Body("application/json", json)) => println(json)
case Response(200, Body("text/xml", xml)) => println(xml)
case Response(_,_) => println("Something unexpected")
}
आदि जो ठीक काम करता है।
कहाँ मैं मुसीबत में भाग गया है:
response match {
case OK(JSON(json)) => println(json)
case OK(XML(xml)) => println(xml)
case NotFound() => println("Something is not there")
// And still drop down to this if necessary:
case Response(302, _) => println("It moved")
}
:
case class OK(body: Body) extends Response(200, body)
case class NotFound() extends Response(404, Body("text/plain", "Not Found"))
case class JSON(json: String) extends Body("application/json", json)
case class XML(xml: String) extends Body("text/xml", xml)
तो मैं सरलीकृत कर सकते हैं कि पैटर्न इस तरह से मेल खाता है
: मैं इस तरह के रूप में इन मामले कक्षाओं के लिए सहायक एक्सटेंशन, चाहते हैं और यह भी मेरे आरईएसटी कोड को सीधे उपयोग करने और वापस करने की अनुमति देगा:
Response(code, Body(contentType, content))
जो ई है गतिशील रूप से एक प्रतिक्रिया बनाने के लिए asier।
case class OK(override val body: Body) extends Response(200, body)
हालांकि, इस पैटर्न मिलान के साथ काम नहीं लगता है:
के माध्यम सेतो ...
मैं इसे (प्रतिवाद चेतावनी के साथ) संकलित करने के लिए मिल सकता है।
Response(200, Body("application/json", "")) match {
case OK(_) => ":-)"
case _ => ":-("
}
res0: java.lang.String = :-(
यह कैसे काम कर सकता है इस पर कोई विचार? मैं अलग-अलग दृष्टिकोणों के लिए खुला हूं, लेकिन यह केस कक्षा
आह, धन्यवाद - मुझे लगता है कि मैंने इसे पूरी तरह से अनुपयोगी के उद्देश्य को याद किया है; यह बहुत उपयोगी है। यह सुनिश्चित करने के लिए कि मैंने आज रात को कवर किया है और स्वीकार करूँगा, यह सुनिश्चित करने के लिए मेरे कोड के साथ पूरी तरह से इसका परीक्षण करेगा। – 7zark7
अच्छा जवाब @ एससीआईएस। कस्टम एक्स्ट्रेक्टर्स उन चीज़ों में से एक हैं जिन्हें मुझे स्कैला के बारे में बहुत पसंद है। – mergeconflict
@ 7zark7 ध्यान दें कि जब आप कस्टम निकालने वाले का उपयोग करते हैं तो आप सीलबंद कक्षाओं की थकावट गारंटी खो देते हैं। –