2011-05-05 36 views
7

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 LiteralVariable 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)).

Trả lời

14

Bạn có thể tìm điều hành ưu tiên đây:

Operator precedence in Scala

Theo câu trả lời đầu tiên - đã ưu tiên cao hơn so với chữ cái. Vì vậy, biên dịch các nhóm biểu như thế này:

foo bar ("x" --> all) 

Nếu bạn sẽ thay thế --> với một cái gì đó ưu tiên thấp hơn (ví dụ chữ cái), sau đó nó phải biên dịch. Ví dụ:

foo bar "x" to all 

Bạn cũng có thể chọn toán tử ưu tiên cao hơn thay vì bar. Một cái gì đó như ~~> sẽ làm điều đó, bởi vì ~ là ký tự đặc biệt và có ưu tiên cao nhất:

foo ~~> "x" --> all 
+0

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. –

Các vấn đề liên quan