मैं एक नए प्रकार, चंक को लागू करने की कोशिश कर रहा हूं, जो एक मानचित्र के समान है। असल में, एक "चंक" या तो स्ट्रिंग -> चंक, या एक स्ट्रिंग से मैपिंग है।स्कैला कस्टम मानचित्र
जैसे इसे इस तरह काम करने के लिए सक्षम होना चाहिए:
val m = new Chunk("some sort of value") // value chunk
assert(m.getValue == "some sort of value")
val n = new Chunk("key" -> new Chunk("value"), // nested chunks
"key2" -> new Chunk("value2"))
assert(n("key").getValue == "value")
assert(n("key2").getValue == "value2")
मैं यह ज्यादातर, काम, सिवाय इसके कि मैं एक छोटे से कैसे + ऑपरेटर अपरिवर्तनीय नक्शे के लिए काम करता है द्वारा उलझन में हूँ।
class Chunk(_map: Map[String, Chunk], _value: Option[String]) extends Map[String, Chunk] {
def this(items: (String, Chunk)*) = this(items.toMap, None)
def this(k: String) = this(new HashMap[String, Chunk], Option(k))
def this(m: Map[String, Chunk]) = this(m, None)
def +[B1 >: Chunk](kv: (String, B1)) = throw new Exception(":(do not know how to make this work")
def -(k: String) = new Chunk(_map - k, _value)
def get(k: String) = _map.get(k)
def iterator = _map.iterator
def getValue = _value.get
def hasValue = _value.isDefined
override def toString() = {
if (hasValue) getValue
else "Chunk(" + (for ((k, v) <- this) yield k + " -> " + v.toString).mkString(", ") + ")"
}
def serialize: String = {
if (hasValue) getValue
else "{" + (for ((k, v) <- this) yield k + "=" + v.serialize).mkString("|") + "}"
}
}
object main extends App {
val m = new Chunk("message_info" -> new Chunk("message_type" -> new Chunk("boom")))
val n = m + ("c" -> new Chunk("boom2"))
}
इसके अलावा, सामान्य रूप में इस कार्यान्वयन उचित है, इस पर टिप्पणी की सराहना की जाएगी:
यहाँ मैं अब है।
धन्यवाद!
संपादित करें: बीजगणितीय डेटा प्रकार समाधान उत्कृष्ट है, लेकिन एक मुद्दा बनी हुई है।
def +[B1 >: Chunk](kv: (String, B1)) = Chunk(m + kv) // compiler hates this
def -(k: String) = Chunk(m - k) // compiler is pretty satisfied with this
- ऑपरेटर यहाँ काम करने लगता है, लेकिन + ऑपरेटर वास्तव में टाइप बी 1 (मुझे लगता है कि) के बारे में कुछ वापस जाने के लिए मुझे चाहता है? यह निम्न समस्या के साथ विफल:
overloaded method value apply with alternatives: (map: Map[String,Chunk])MapChunk <and> (elems: (String, Chunk)*)MapChunk cannot be applied to (scala.collection.immutable.Map[String,B1])
EDIT2: Xiefei इस सवाल का जवाब - नक्शा विस्तार की आवश्यकता है कि मैं हिस्सा के एक महाप्रकार (बी 1) के साथ + संभाल, इसलिए क्रम में यह करने के लिए मैं करना होगा उस के लिए कुछ कार्यान्वयन, तो यह पर्याप्त होगा:
def +[B1 >: Chunk](kv: (String, B1)) = m + kv
हालांकि, मैं कभी सच, उपयोग करने के लिए है कि एक इरादा नहीं है बजाय, मैं भी मेरी कार्यान्वयन कि एक हिस्सा देता है इस प्रकार में शामिल होंगे:
def +(kv: (String, Chunk)):Chunk = Chunk(m + kv)
अपरिवर्तनीय मानचित्र के मामले में '+' के लिए कार्यान्वयन, अतिरिक्त कुंजी/मूल्य के साथ एक नया मानचित्र वापस करना होगा, है ना? आप पहले से ही एक मानचित्र ('_map') 'लपेटें' हैं, इसलिए आपके' + 'के कार्यान्वयन के लिए, बस '_map' पर प्रतिनिधि होगा:' def + [B1>: Chunk] (kv: (स्ट्रिंग, बी 1)) = _map + केवी'। असली मुद्दा यह है कि इससे 'सरल' चंक की (जो केवल एक स्ट्रिंग हैं) के लिए कोई समझ नहीं आता है। दूसरे शब्दों में, ऊपर दिए गए कन्स्ट्रक्टरों का सेट होने पर, ** और ** '+' को लागू करने से आपकी '' चंक' की परिभाषा टूट जाती है ... क्योंकि यह स्ट्रिंग-चंक को // // // // हिस्सा। – Faiz