我试图避免这样的构造:
val result = this.getClass.getSimpleName
if (result.endsWith("$")) result.init else result
好的,在此示例中,then
and 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}
我猜编译器需要额外的东西来推断类型。
我在不知不觉中假定了从左到右的类型推断方式,但始终坚持运算符的优先级和方法名称的关联性,尤其是
—
彼得·施米兹
?
在以任何其他alphanum char 开头作为方法名称的第一个char和一个:
用于左侧关联性的开头。因此,我必须重新考虑新的方法名称,以使类型推断从左到右起作用。谢谢!
HasIs
,IsWithCondition
,ConditionAndTrueCase
,将建立表达的部分从左至右类。)