/ / Scala - DSL: अतिभारित उपसर्ग समारोह अस्पष्टता

स्कैला - डीएसएल: ओवरलोडेड उपसर्ग फ़ंक्शन अस्पष्टता - स्कैला, डीएसएल, विधि-ओवरलोडिंग, करीइंग

मेरे DSL में मुझे यह कार्यक्षमता चाहिए:

class Test {

val compA = dependant(true, true)(Component("parameters"))

//and this shortcut:

val compB = dependant Component("parameters")
}

कहा पे:

def dependant(onEnable: Boolean, onDisable: Boolean)(c: Component): Component = {
//...
}

def dependant(c: Component): Component = dependant(false, true)(c)

सब ठीक है, हालांकि, मैं इस वाक्यविन्यास का उपयोग नहीं कर सकता:

val compB = dependant Component("parameters")

क्योंकि यह कहता है

अतिभारित परिभाषा के अस्पष्ट संदर्भ,में निर्भर दोनों विधि श्रेणी का प्रकार घटक) श्रेणी और श्रेणी के प्रकार पर निर्भर घटक और विधि (c: घटक) घटक मिलान अपेक्षित प्रकार?

लेकिन अगर मैं कोष्ठक में पैरामीटर संलग्न करता हूं:

val compB = dependant(Component("parameters"))

त्रुटि हो गई है। जाहिर है, संकलक कोष्ठक के मामले को कम करने में विफल रहता है। क्या यह अपेक्षित है या मैं कुछ गलत कर रहा हूं? यदि यह अपेक्षित है, तो क्यों? मैं विधि का उपयोग करने की क्षमता को कैसे पुनः प्राप्त कर सकता हूं dependant एक उपसर्ग के रूप में, कोष्ठक के बिना?

उत्तर:

जवाब के लिए 2 № 1

में dependant Component("parameters") आप कॉल करने के लिए एक उपसर्ग संकेतन का उपयोग करने की कोशिश कर रहे हैं dependant। उपसर्ग संकेतन के लिए स्काला का समर्थन सीमित है।

देख Scala - उपसर्ग Unary ऑपरेटर्स.

एक विकल्प एक उपसर्ग संकेतन का उपयोग करना है (जैसा कि अंदर है Component("parameters") dependant)। यदि आप कंपोननेट के कार्यान्वयन को संशोधित कर सकते हैं, तो इसका मतलब है कि जोड़ना dependant करने के तरीके Component:

class Component(name: String) {
def dependant: Component = //...
def dependant(onEnable: Boolean, onDisable: Boolean): Component = {
//...
}
}

class Test {
val compA = Component("parameters") dependant(true, true)
val compB = Component("parameters") dependant
}

यदि आप संशोधित नहीं कर सकते हैं Component, आप "मेरे पुस्तकालय मुहावरा दलाल" का उपयोग कर सकते हैं। देख http://www.decodified.com/scala/2010/12/02/the-quickpimp-pattern.html इस मुहावरे के संक्षिप्त परिचय के लिए (नीचे एक अनाम वर्ग का उपयोग करने पर चेतावनी के साथ):

case class Component(name: String)

implicit def toPostifxDependentOps( c: Component ) = new {
def dependant: Component = dependant(false, true)
def dependant(onEnable: Boolean, onDisable: Boolean): Component = {
//...
}
}

class Test {
val compA = Component("parameters") dependant(true, true)
val compB = Component("parameters") dependant
}

जवाब के लिए 2 № 2

लेखन myObject functionName paramके बजाय myObject.functionName(param) यदि आप किसी वस्तु को प्रस्तावित करते हैं तो अपेक्षा के अनुरूप काम करता है। यदि आप टी नहीं करते हैं, तो संकलक खो जाएगा। उदाहरण के लिए:

scala> println("Hello")
Hello

scala> println "Hello"
<console>:1: error: ";" expected but string literal found.
println "Hello"
^

एक संभव समाधान: अपनी विधि को लपेटने के लिए एक वस्तु बनाएं:

scala> case class Component(name: String, components: Option[Component] = None)
defined class Component

scala> object depends {def on(c: Component) = Component("dependant", Some(c))}
defined module depends

scala> depends on Component("foo")
res3: Component = Component(dependant,Some(Component(foo,None)))