Tôi cố gắng để tránh các cấu trúc như thế này:ternary điều hành tương tự như:?
val result = this.getClass.getSimpleName
if (result.endsWith("$")) result.init else result
Ok, trong ví dụ này then
và else
chi nhánh là đơn giản, nhưng bạn có thể những hình ảnh 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)
}
Defined đó, tôi có thể thay thế các ví dụ đơn giản trên với:
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 những 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 thêm công cụ để suy ra các loại.
Kể từ khi tôi đã không thực sự có điều này trong câu trả lời của tôi - lý do bạn' gặp rắc rối là suy luận kiểu hoạt động tốt nhất từ trái sang phải, nhưng bạn ràng buộc các thẻ của bạn với nhau từ phải sang trái vì ưu tiên toán tử. Nếu bạn làm cho tất cả các từ tuyên bố của bạn (với cùng một ưu tiên) và thay đổi cách mọi thứ nhóm lại với nhau, bạn sẽ nhận được suy luận mà bạn muốn. (Tức là bạn sẽ có các lớp 'HasIs',' IsWithCondition', 'ConditionAndTrueCase' sẽ xây dựng các phần của biểu thức từ trái sang phải.) –
Tôi vô tình giả định cách suy luận kiểu từ trái sang phải, nhưng bị mắc kẹt với quyền ưu tiên của toán tử và sự kết hợp của các tên phương thức, đặc biệt là bắt đầu với '?' trước bất kỳ char alphanum nào khác như một tên phương thức char đầu tiên và một ':' cho sự 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 để có được suy luận kiểu làm việc từ trái sang phải. cảm ơn! –