Tôi đang làm việc trên DSL và tôi đã gặp sự cố khi sử dụng các phương thức như các toán tử infix trong một chuỗi. Tôi sẽ cố gắng giải thích nó bằng một số mã. Tôi có một đặc điểm Term
và các trường hợp lớp học Literal
và Variable
mở rộng nó. Tôi muốn xây dựng một danh sách các cá thể thuật ngữ sử dụng một số toán tử.Tại sao tôi không thể chuỗi một số phương thức gọi là vi phạm Scala
case class Expr(val terms: List[Term]) {
def +(v: String) = Expr(Literal(v) :: terms)
def -->(func: List[String] => List[String]) = terms match {
case Literal(v) :: ts => Expr(Variable(v, func) :: ts)
case _ => throw new Exception("Can only apply function on literal")
}
}
object foo {
def bar(name: String) = Expr(Literal(name) :: Nil)
}
// some functions
val one = ...
val all = ...
// works
foo bar "x"
// res1: Expr = Expr(List(Literal(x)))
// works not
foo bar "x" --> all
// error: value --> is not a member of java.lang.String
// works
(foo bar "x") --> all
// res1: Expr = Expr(List(Variable(x,<function1>)))
tôi sẽ hy vọng điều này sẽ tương đương với foo.bar("x").-->(all)
nhưng người phiên dịch dường như nhìn thấy nó như foo.bar("x".-->(all))
.
Cảm ơn! Tôi đoán nhìn thấy các nhà khai thác như phương pháp đã cho tôi quên rằng họ có thể có ưu tiên. –