परिदृश्य: मैं एक आईएल पार्स कर रहा हूं और उदाहरण के लिए एक स्टैक्ड किए गए प्रतिनिधित्व से एक सीएफजी में परिवर्तित करना चाहता हूं।संग्रह में स्कैला केस क्लासेस
मेरी आईएल में पुशेंट (मूल्य), पॉप इत्यादि जैसे कई संचालन शामिल हैं। सवाल यह है कि अब स्केल के संदर्भ में कौन सा कार्यान्वयन सही होगा। मैं इतना है कि मैं के बाद से PushInt (1) PushInt के बराबर है कोड Alà
op match {
case PushInt(x) => doSomethingWith x
case Pop => ...
}
अब समस्या PushInt(1) :: PushInt(1) :: Pop :: Pop
की तरह एक दृश्य के साथ मौजूद है लिख सकते हैं मामले वर्गों/वस्तुओं या एक्सट्रैक्टर्स उपयोग करने के लिए प्यार होता है (1) और मैं नहीं कर सकता एक संग्रह में एकाधिक (बराबर) संचालन जोड़ें। हालांकि मुझे पता है कि मैं कुछ जानकारी फेंक रहा हूं जो प्रवाह में स्थिति है, लेकिन यह अनुक्रम में टी इंडेक्स के रूप में निहित रूप से संग्रहीत है।
एक संभावित समाधान हैशकोड विधि को ओवरराइड करना और बराबर/हैशकोड के नियमों को तोड़ना है। मैं इसके साथ वास्तव में खुश नहीं हूँ।
एक अन्य विकल्प, एक "निर्माण के समय" प्रचार करता है जो सार आधार में संग्रहीत किया जाता है ताकि
case class PushInt(value: Int) extends AbstractOp(AbstractOp.nextIndex)
उपयोग एक्सट्रैक्टर्स लेकिन इस मामले में मैं hashCode के कार्यान्वयन की तरह अच्छा सुविधाओं को याद करेंगे है के बराबर होती है, एक संपूर्ण मैच के लिए जांच और अधिक महत्वपूर्ण जांच।
तो मेरे सवाल का अब मेरी आवश्यकताओं के अनुसार मेरी संरचना मॉडल कैसे है। स्कैला के मामले में संभावित समाधानों में से कोई भी "सही" है?
आप संग्रह में एकाधिक बराबर संचालन नहीं जोड़ सकते हैं? क्या यह मामला केवल तभी संग्रह है जब संग्रह एक सेट है? –
नहीं, और अनुक्रम में अनुक्रमणिका के लिए पूछना भी बदतर है। ऑब्जेक्ट बराबर होने पर निश्चित रूप से सही कौन सा है। –
आप निश्चित रूप से सूची में समान तत्वों को दोहरा सकते हैं। –