2013-02-05 68 views
5

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

trait Numbers { 
    lazy val values = holding 
    private var holding = Set.empty[Int] 
    protected def includes(i:Int) { 
    holding += i 
    } 
} 

trait Odd extends Numbers{ 
    includes(1) 
    includes(3) 
    includes(5) 
    includes(7) 
    includes(9) 
} 

trait Even extends Numbers { 
    includes(2) 
    includes(4) 
    includes(6) 
    includes(8) 
} 

इस परिणाम कैसे विधि अधिभावी के बारे में मैं

val n = new Odd with Even 
println(n.values) 

Set(5, 1, 6, 9, 2, 7, 3, 8, 4) 
+0

मैं एक स्काला कंटेनर यहाँ में इस दृष्टिकोण को लागू किया है http://higher-state.blogspot.co.uk/2013/03/scala-210 -simple-di-container.html –

उत्तर

3

का चाहते हैं देता है? तुम तो विशेषता linearization में देख सकते हैं "सुपर" वस्तु,

trait Numbers { 
    def holding = Vector[Int]() 
    lazy val values = holding 
} 

trait Odd extends Numbers { 
    override def holding = super.holding ++ Vector(1,3,5) 
} 

trait Even extends Numbers { 
    override def holding = super.holding ++ Vector(0,2,4) 
} 

(new Odd with Even).values // Vector(1, 3, 5, 0, 2, 4) 
(new Even with Odd).values // Vector(0, 2, 4, 1, 3, 5) 
+0

उस दृष्टिकोण के बारे में सोचा नहीं था। आदर्श मैं एक अच्छा डीएसएल महसूस के लिए लिस्टिंग तत्वों के सौंदर्यशास्त्र के साथ रहना चाहता हूं। बेशक यह संभव नहीं हो सकता है, अगर अगले कुछ दिनों में कुछ और नहीं हो जाता है (छुट्टियों पर होगा), तो मैं आपको जवाब दूंगा –

+0

यह एक दिलचस्प चुनौती है, लेकिन मुझे डर है कि यह कार्य मिश्रित संरचना की भावना के खिलाफ चला जाता है , जहां रैखिकरण एकाधिक विरासत गुणों में से एक मान का चयन करने की कोशिश करता है (उन्हें मर्ज करने के बजाए)। –