2015-05-19 9 views
8

मैं हाल ही में पता चला कि एक का उपयोग दलाल को समृद्ध मेरी लाइब्रेरी पैटर्न कर सकते हैं साथी करने के तरीकों को जोड़ने के लिए .type का उपयोग कर वस्तुओं:मैं पैकेज ऑब्जेक्ट को कैसे समृद्ध करूं?

object Whatever { } 

implicit class WhateverExtensions(val obj: Whatever.type) { 
    def greet = println("Hi!") 
} 

Whatever.greet 

दुर्भाग्य से एक ही scala.math की तरह पैकेज वस्तुओं के लिए काम करने के लिए प्रतीत नहीं होता:

Error:(153, 47) type mismatch; 
found : math.type 
required: AnyRef 
Note that math extends Any, not AnyRef. 
Such types can participate in value classes, but instances 
cannot appear in singleton types or in reference comparisons. 
    implicit class MathExtensions(val obj: scala.math.type) extends AnyVal { 
               ^
:
implicit class MathExtensions(val obj: scala.math.type) { 
    def min(x: Money, y: Money): Money = ??? 
} 

मैं निम्नलिखित संकलक त्रुटि मिलती है

क्या पैकेज ऑब्जेक्ट को समृद्ध करना संभव है?

उत्तर

8

मुझे नहीं लगता कि यह उस फैशन में संभव है, हालांकि दस्तावेज़ीकरण बेहद पतला है। कंपाइलर स्पष्ट रूप से इसे सिंगलटन से अलग तरीके से इलाज कर रहा है। भले ही उस विधि को संकलित किया गया हो, import scala.math._निश्चित रूप से आपकी min विधि आयात करें, क्योंकि निहित रूपांतरण को ट्रिगर करने के लिए कुछ भी नहीं है। और ठीक है, अगर math.customMin संभव था, तो दो आयात की आवश्यकता होगी।

यह किसी अन्य तरीके से संभव है। हम scala.math पैकेज में जो कुछ भी चाहते हैं उसे परिभाषित कर सकते हैं। हम शीर्ष-स्तर पर विधियों को परिभाषित नहीं कर सकते हैं, इसलिए हमें इसे कार्य करने के लिए कुछ ऑब्जेक्ट ट्रिकरी को नियोजित करने की आवश्यकता है।

package scala.math 

object intMin extends ((Int, Int) => Int) { 
    def apply(x: Int, y: Int): Int = x + y 
} 

कुछ परीक्षण: बिल्कुल डॉक्स में

import scala.math._ 

object Test extends App { 

    println(intMin(4, 10)) 

} 
+1

ज्यादा नहीं: http://www.scala-lang.org/files/archive/spec/2.11/09-top-level- definitions.html # पैकेज वस्तुओं। उस चीज़ के प्रकार को प्राप्त करना असंभव प्रतीत होता है: 'टाइप टी =' 'math''.type' देता है "त्रुटि: (5, 12) स्थिर पहचानकर्ता आवश्यक है, लेकिन स्कैला। मिला। टाइप टी =' गणित'। प्रकार"। –

+0

यह भी देखें: http://www.scala-lang.org/docu/files/packageobjects/packageobjects.html –

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