다음과 같은 구문을 피하려고합니다.
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
클래스가 있습니다.)