2012-10-07 14 views
10

मैं निम्न विधि है:स्केला: एक विधि (डीईएफ़) का उपयोग कर बनाम एक समारोह (वैल) में डिफ़ॉल्ट मानकों को परिभाषित

scala> def method_with_default(x: String = "default") = {x + "!"} 
method_with_default: (x: String)java.lang.String 

scala> method_with_default() 
res5: java.lang.String = default! 

scala> method_with_default("value") 
res6: java.lang.String = value! 

मैं एक वैल के साथ एक ही प्राप्त करने के लिए कोशिश कर रहा हूँ, लेकिन मैं एक मिल सिंटेक्स त्रुटि, इस तरह: (ठीक नहीं डिफ़ॉल्ट मान के साथ, यह एक संकलित)

scala> val function_with_default = (x: String) => {x + "!"} 
function_with_default: String => java.lang.String = <function1> 

(लेकिन मैं नहीं मिल सका संकलित करने के लिए यह एक ...)

scala> val function_with_default = (x: String = "default") => {x + "!"} 
<console>:1: error: ')' expected but '=' found. 
     val function_with_default = (x: String = "default") => {x + "!"} 
              ^

कोई विचार?

उत्तर

5

ऐसा करने का कोई तरीका नहीं है। सबसे अच्छा आप प्राप्त कर सकते हैं वह ऑब्जेक्ट है जो Function1 और Function0 दोनों को बढ़ाता है जहां Function0 की लागू विधि डिफ़ॉल्ट पैरामीटर के साथ अन्य लागू विधि को कॉल करती है।

val functionWithDefault = new Function1[String,String] with Function0[String] { 
    override def apply = apply("default") 
    override def apply(x:String) = x + "!" 
} 

आप अधिक बार इस तरह के कार्यों की जरूरत है, तो आप डिफ़ॉल्ट बाहर कारक बन सकते हैं एक अमूर्त वर्ग DefaultFunction1 इस तरह में विधि लागू होते हैं:

val functionWithDefault = new DefaultFunction1[String,String]("default") { 
    override def apply(x:String) = x + "!" 
} 

abstract class DefaultFunction1[-A,+B](default:A) 
       extends Function1[A,B] with Function0[B] { 
    override def apply = apply(default) 
} 
+0

Function0 साथ Function1 काफी चालाक है, लेकिन मैं यह है कहेंगे थोड़ा सुगंधित केवल मेरी राय यहाँ। कोई चर्चा इरादा नहीं है। :) – pedrofurla

+1

बीटीडब्ल्यू आप कार्यों के लिए शर्करा का उपयोग कर सकते हैं: (नया) (स्ट्रिंग => स्ट्रिंग) (() => स्ट्रिंग) {ओवरराइड डीफ़ लागू = लागू ("डिफ़ॉल्ट"); ओवरराइड डीफ़ लागू (एक्स: स्ट्रिंग) = एक्स + "!" } 'काम करता है। – pedrofurla

+0

मैं मानता हूं कि यह थोड़ा सुगंधित है, लेकिन मुझे ऐसा समाधान नहीं दिख रहा है जो नहीं है। –

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