Tôi đang cố gắng tránh các cấu trúc như thế này:
val result = this.getClass.getSimpleName
if (result.endsWith("$")) result.init else result
Ok, trong ví dụ này then
, else
nhánh và rất đơn giản, nhưng bạn có thể hình dung những cái phức tạp. Tôi đã xây dựng như sau:
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)
}
Đã xác định điều đó, tôi có thể thay thế ví dụ đơn giản ở trên bằng:
this.getClass.getSimpleName is {s: String => s.endsWith("$")} ? {s: String => s.init} :: {s: String => s}
Nhưng làm thế nào tôi có thể thoát khỏi s: String =>
? Tôi muốn một cái gì đó như thế:
this.getClass.getSimpleName is {_.endsWith("$")} ? {_.init} :: {identity}
Tôi đoán trình biên dịch cần những thứ bổ sung để suy ra các loại.
?
trước bất kỳ ký tự alphanum nào khác như một tên phương thức ký tự đầu tiên và một :
cho phép kết hợp trái. Vì vậy, tôi phải suy nghĩ lại về các tên phương thức mới để suy luận kiểu hoạt động từ trái sang phải. cảm ơn!
HasIs
,IsWithCondition
,ConditionAndTrueCase
lớp đó sẽ xây dựng các phần của biểu thức từ trái sang phải.)