मैं इस तरह से निर्माण से बचने की कोशिश कर रहा हूं:
val result = this.getClass.getSimpleName
if (result.endsWith("$")) result.init else result
ठीक है, इस उदाहरण में then
और else
शाखा सरल है, लेकिन आप जटिल छवि बना सकते हैं। मैंने निम्नलिखित का निर्माण किया:
object TernaryOp {
class Ternary[T](t: T) {
def is[R](bte: BranchThenElse[T,R]) = if (bte.branch(t)) bte.then(t) else bte.elze(t)
}
class Branch[T](branch: T => Boolean) {
def ?[R] (then: T => R) = new BranchThen(branch,then)
}
class BranchThen[T,R](val branch: T => Boolean, val then: T => R)
class Elze[T,R](elze: T => R) {
def :: (bt: BranchThen[T,R]) = new BranchThenElse(bt.branch,bt.then,elze)
}
class BranchThenElse[T,R](val branch: T => Boolean, val then: T => R, val elze: T => R)
implicit def any2Ternary[T](t: T) = new Ternary(t)
implicit def fct2Branch[T](branch: T => Boolean) = new Branch(branch)
implicit def fct2Elze[T,R](elze: T => R) = new Elze(elze)
}
परिभाषित किया गया है कि, मैं उपरोक्त सरल उदाहरण को बदल सकता हूं:
this.getClass.getSimpleName is {s: String => s.endsWith("$")} ? {s: String => s.init} :: {s: String => s}
लेकिन मैं कैसे छुटकारा पा सकता हूं s: String =>
? मुझे ऐसा कुछ चाहिए:
this.getClass.getSimpleName is {_.endsWith("$")} ? {_.init} :: {identity}
मुझे लगता है कि कंपाइलर को निम्न प्रकार के अतिरिक्त सामान की आवश्यकता होती है।
?
से किसी भी अन्य अल्फ़ान्यूम चार से पहले एक विधि नाम के रूप में पहले चार और :
बाएं सहयोगी के लिए। इसलिए मुझे नई विधि के नामों पर पुनर्विचार करना होगा ताकि बाएं से दाएं काम कर रहे प्रकार की खोज हो सके। धन्यवाद!
HasIs
, कक्षाएंIsWithCondition
,ConditionAndTrueCase
जो अभिव्यक्ति के कुछ हिस्सों को बाएं से दाएं तक