2011-05-29 8 views
9

मुझे कुछ संदेशों को पार्स करने की आवश्यकता है। किसी संदेश के पहले 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") 

ऐसा लगता है जैसे मैं नक्शा निर्माण, बजाय साथी वस्तु में तुच्छ समारोह का उपयोग कर अभिव्यक्ति में सीधे संदेश वस्तु निर्माता का उल्लेख करने में सक्षम होना चाहिए, लेकिन मैं हेवन इसे व्यक्त करने के किसी भी तरीके से नहीं पता लगाया। क्या उधर रास्ता है?

+0

'आखिरकार, निर्माता केवल कार्य हैं' क्या वे हैं? ऐसा कौन कहता है? मेरी धारणा अलग है। आम तौर पर, मैं किसी ऑब्जेक्ट पर कई बार फ़ंक्शन का आह्वान कर सकता हूं और मुझे पहले दो मतभेदों का नाम देने के लिए 'नया' कहने की ज़रूरत नहीं है, जो मेरे दिमाग में आती है। –

+0

@ उपयोगकर्ता-अज्ञात हां, कन्स्ट्रक्टर वास्तव में (स्थैतिक) फ़ंक्शंस हैं: (i) 'नया' का उपयोग केवल आपको सिखाए जाने के लिए अतिरिक्त वाक्यविन्यास है कि यह एक विशेष प्रकार का फ़ंक्शन है (कई भाषाएं स्कैला के मामले सहित कीवर्ड को छोड़ देती हैं- वर्ग रचनाकार)। (ii) यह संक्षेप में एक स्थिर विधि है; आप किसी मौजूदा ऑब्जेक्ट पर कन्स्ट्रक्टर को कॉल नहीं करते हैं (यह एक विधि नहीं है)। –

उत्तर

12

"a" -> (new MsgA(_)) 

(सभी कोष्ठकों की जरूरत है) की कोशिश करो।

यहां तक ​​कि अगर यह काम नहीं किया है, तो आप निश्चित रूप से हमेशा समारोह स्पष्ट रूप से निर्धारित कर सकते हैं:

"a" -> ((s: String) => new MsgA(s)) 
+0

क्या आपका मतलब '" ए "-> (नया संदेश (_))'? –

+0

बहुत बहुत धन्यवाद। बस मैं जो खोज रहा था: प्ले धारक के साथ शॉर्ट फॉर्म फ़ंक्शन शाब्दिक (पृष्ठ 1 9 1 में प्रोग्रामिंग में स्कैला, दूसरा संस्करण।, अगर कोई और पढ़ना चाहता है) – Willard

+0

@ किम - मुझे लगता है कि यह एक स्ट्रिंग था, एक var नहीं, तो निश्चित रूप से, "" एक "'। –

2
val cm = Map[String, (String) => MsgBase]("a" -> (new MsgA(_)), "b" -> (new MsgB(_))) 
3

इस मामले में यह बेहतर होगा मामला वर्गों का उपयोग करने के, जो स्वत: के लिए आप कार्यों प्रदान के लिए नई वस्तुओं का निर्माण

scala> case class MsgA(message: String) extends MsgBase(message) 
scala> case class MsgB(message: String) extends MsgBase(message) 

तो तुम, बस उन्हें नाम से उल्लेख कर सकते हैं किसी भी वाक्य-भूमि के ऊपर

scala> val m = Map("a"->MsgA, "b"->MsgB) 
m: scala.collection.immutable.Map[java.lang.String,scala.runtime.AbstractFunction1[java.lang.String,Product with MsgBase]] = Map((a,<function1>), (b,<function1>)) 

scala> m("a")("qqq")        
res1: Product with MsgBase = MsgA(qqq) 

बिना एक वैकल्पिक दृष्टिकोण आप साथी वस्तु बना सकते हैं overrided के साथ हाथ से विधि लागू होते हैं। विवरण के लिए Programming scala, chapter 6

संबंधित मुद्दे