/ / क्या स्केल - स्कैला, स्कैला-2.8, डिफ़ॉल्ट-मूल्य, नाम-पैरामीटर में किसी अन्य तर्क पर निर्भर करने के लिए वैकल्पिक तर्क मान के लिए यह संभव है

क्या स्केल - स्कैला, स्कैला-2.8, डिफ़ॉल्ट-मूल्य, नाम-पैरामीटर में किसी अन्य तर्क पर निर्भर करने के लिए वैकल्पिक तर्क मान के लिए यह संभव है

क्या किसी को पता है कि स्कैला में ऐसा कुछ संभव है:

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