मुझे कुछ संदेशों को पार्स करने की आवश्यकता है। किसी संदेश के पहले 4 बाइट संदेश के प्रकार की पहचान करते हैं, इसलिए, इसका उपयोग करके, मैं उचित प्रकार की ऑब्जेक्ट को तुरंत चालू कर सकता हूं। इसे एक कुशल संचालन करने के लिए, मैंने सोचा कि मैं एक हैश मैप बनाउंगा जहां वे पहले 4 बाइट्स हैं, और मान ऑब्जेक्ट कन्स्ट्रक्टर है। मैं सिर्फ कन्स्ट्रक्टर को देख सकता हूं और इसे बुला सकता हूं।स्केल में एक समारोह के रूप में एक कन्स्ट्रक्टर का इलाज - मानचित्र में रचनाकारों को कैसे रखा जाए?
आखिरकार, निर्माता केवल कार्य हैं, और मानचित्र में फ़ंक्शंस डालने में कोई समस्या नहीं होनी चाहिए। यह पता चला है कि मुझे इसके साथ कुछ कठिनाई हो रही है क्योंकि मुझे नहीं पता कि कन्स्ट्रक्टर के संदर्भ को सही तरीके से कैसे व्यक्त किया जाए।
एक सरल उदाहरण के साथ ठोस प्राप्त करने के लिए, मान लीजिए हम संदेश आधार वर्ग, MsgBase
, और एक जोड़ी उपवर्गों, MsgA
और MsgB
है। यदि मैं प्रत्येक संदेश के लिए एक साथी वस्तु बना देता हूं और इसमें फ़ैक्टरी फ़ंक्शन डालता हूं, तो मैं उन कार्यों का उपयोग करके किसी भी समस्या के बिना सरणी बना सकता हूं।
यहां एक सरलीकृत नमूना है जो संदेश को स्ट्रिंग के रूप में लेता है।
class MsgBase(message: String) { }
class MsgA(message: String) extends MsgBase(message) { }
object MsgA { def makeIt(message: String): MsgA = new MsgA(message) }
और जहां MsgB
समान है। तब मैं नक्शा बना सकते हैं:
val cm = Map[String, (String) => MsgBase]("a" -> MsgA.makeIt, "b" -> MsgB.makeIt)
val myMsg = cm("a")("a.This is the message")
ऐसा लगता है जैसे मैं नक्शा निर्माण, बजाय साथी वस्तु में तुच्छ समारोह का उपयोग कर अभिव्यक्ति में सीधे संदेश वस्तु निर्माता का उल्लेख करने में सक्षम होना चाहिए, लेकिन मैं हेवन इसे व्यक्त करने के किसी भी तरीके से नहीं पता लगाया। क्या उधर रास्ता है?
'आखिरकार, निर्माता केवल कार्य हैं' क्या वे हैं? ऐसा कौन कहता है? मेरी धारणा अलग है। आम तौर पर, मैं किसी ऑब्जेक्ट पर कई बार फ़ंक्शन का आह्वान कर सकता हूं और मुझे पहले दो मतभेदों का नाम देने के लिए 'नया' कहने की ज़रूरत नहीं है, जो मेरे दिमाग में आती है। –
@ उपयोगकर्ता-अज्ञात हां, कन्स्ट्रक्टर वास्तव में (स्थैतिक) फ़ंक्शंस हैं: (i) 'नया' का उपयोग केवल आपको सिखाए जाने के लिए अतिरिक्त वाक्यविन्यास है कि यह एक विशेष प्रकार का फ़ंक्शन है (कई भाषाएं स्कैला के मामले सहित कीवर्ड को छोड़ देती हैं- वर्ग रचनाकार)। (ii) यह संक्षेप में एक स्थिर विधि है; आप किसी मौजूदा ऑब्जेक्ट पर कन्स्ट्रक्टर को कॉल नहीं करते हैं (यह एक विधि नहीं है)। –