मैं इस तरह से निर्माण से बचने की कोशिश कर रहा हूं:
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जो अभिव्यक्ति के कुछ हिस्सों को बाएं से दाएं तक