क्या किसी को पता है कि स्कैला में ऐसा कुछ संभव है:
case class Thing(property:String)
def f(thing:Thing, prop:String = thing.property) = println(prop)
उपरोक्त कोड संकलित नहीं करता है, त्रुटि दे रहा है error: not found: value thing
पर thing.property
निम्नलिखित अपेक्षित व्यवहार दिखाता है:
f(Thing("abc"), "123") // prints "123"
f(Thing("abc")) // prints "abc"
मुझे एहसास है कि मैं कर सकता हूं prop
तर्क एक Option[String]
और फ़ंक्शन परिभाषा में चेक करें, लेकिन मैं सोच रहा था कि 2.8.0 में नए नाम / डिफ़ॉल्ट तर्क समर्थन के साथ इसके आसपास कोई रास्ता था या नहीं।
उत्तर:
उत्तर № 1 के लिए 20हां, यह स्कैला 2.8 में संभव है। यहां से उद्धरण दिया गया है "स्कैला 2.8 में नामित और डिफ़ॉल्ट तर्क" डिजाइन दस्तावेज़:
चूंकि पैरामीटर का दायरा बढ़ता है सब से अधिकबाद की पैरामीटर सूचियां (और विधि निकाय), डिफ़ॉल्ट अभिव्यक्ति पैरामीटर पर निर्भर कर सकते हैं पूर्व पैरामीटर सूचियों की (लेकिन नहीं उसी में अन्य पैरामीटर पर पैरामीटर सूची)। ध्यान दें कि उपयोग करते समय एक डिफ़ॉल्ट मान जो पर निर्भर करता है पहले पैरामीटर, वास्तविक तर्क का उपयोग किया जाता है, डिफ़ॉल्ट नहीं तर्क।
def f(a: Int = 0)(b: Int = a + 1) = b // OK
और एक और उदाहरण:
def f[T](a: Int = 1)(b: T = a + 1)(c: T = b)
// generates:
// def f$default$1[T]: Int = 1
// def f$default$2[T](a: Int): Int = a + 1
// def f$default$3[T](a: Int)(b: T): T = b
इसके अनुसार, आपका कोड निम्नानुसार देख सकता है:
scala> case class Thing(property:String)
defined class Thing
scala> def f(thing:Thing)(prop:String = thing.property) = println(prop)
f: (thing: Thing)(prop: String)Unit
scala> f(Thing("abc"))("123")
123
scala> f(Thing("abc"))()
abc
उत्तर № 2 के लिए 1
एक और सरल समाधान सिर्फ विधि को अधिभारित करना है:
case class Thing (property: String)
def f(thing: Thing, prop: String) = println(prop)
def f(thing: Thing) = f(thing, thing.property)
जवाब के लिए 0 № 3
यह वही है Option
के लिए है। आप इसका उपयोग कर सकते हैं getOrElse
विधि कॉल या विधि के अंदर विधि f
.
scala> val abc = Some("abc")
abc: Some[java.lang.String] = Some(abc)
scala> val none: Option[String] = None
none: Option[String] = None
scala> println(abc getOrElse "123")
abc
scala> println(none getOrElse "123")
123
scala> def f(o: Option[String]) = println(o getOrElse "123")
f: (o: Option[String])Unit
scala> f(abc)
abc
scala> f(none)
123
ओह यहां कुछ ऐसा है जो आप डिफ़ॉल्ट तर्कों के माध्यम से कर सकते हैं:
scala> case class Thing(property: String = "123")
defined class Thing
scala> def f(t: Thing) = println(t.property)
f: (t: Thing)Unit
scala> f(Thing("abc"))
abc
scala> f(Thing())
123
अपेक्षित व्यवहार सरल अधिभार के साथ हासिल किया जा सकता है। मुझे विधि को एक में रखना होगा object
क्योंकि ऐसा लगता है कि आरईपीएल प्रत्यक्ष ओवरलोडेड फ़ंक्शन घोषणाओं की अनुमति नहीं देता है:
scala> object O {
def overloaded(t:Thing) = println(t.property)
def overloaded(t:Thing,s:String) = println(s)
}
defined module O
scala> O.overloaded(Thing("abc"), "123")
123
scala> O.overloaded(Thing("abc"))
abc