无法解释的Scala编译器错误

时间:2014-07-24 10:38:30

标签: scala dsl

我在Scala中创建了一个OData查询语言。它进展得很顺利,但我得到了一个我无法解释的错误。

首先让我向您展示我创建的Query类(为简洁起见省略了一些代码):

case class Query(val name: String, val args: Seq[(String, String)] = Seq())
                (val parent: Option[Query] = None)
                (val options: Seq[QueryOption] = Seq()) {

  def /(newChild: Query): Query = new Query(newChild.name, newChild.args)(Some(this))(options)

  def $(newOptions: QueryOption*): Query = new Query(name, args)(parent)(options ++ newOptions)

  def |(newArgs: (String, String)*): Query = new Query(name, args ++ newArgs)(parent)(options)
}


object Query {

  private def emptyQueryWithName(name: String): Query = Query(name, Seq())(None)(Seq())

  def /(name: String): Query = emptyQueryWithName(name)

  implicit def createQuery(name: String): Query = emptyQueryWithName(name)
}

package object queries {

  implicit class QueryOps(name: String) {

    def ===(attr: Any): (String, String) = (name, attr.toString)
  }
}

我已经为这个DSL编写了一些测试,但它们主要起作用。例如这段代码:

Query / "Pages" / "Component" | ("ItemId" === 123, "PublicationId" === 1) $ ("Title" ==| "Test Title") 

给我预期的查询:/ Pages / Component(ItemId = 123,PublicationId = 1)?$ filter = Title eq' Test Title'

但是这个:

Query / "Pages" | ("ItemId" === 123) / "Title" $ jsonFormat $ ("Url" ==| "Bla")

抱怨' /"标题"'部分。好像编译器不知道正在进行的代码导致Query实例。它无法找到' /'方法。对我而言,这似乎很奇怪,因为' $'找到方法,具有相同的范围;查询类。

我可能遇到了一些我无法理解的限制,但我想了解一下。谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

括号修复问题的事实通常意味着运算符优先级问题。看看http://books.google.es/books?id=MFjNhTjeQKkC&pg=PA90&lpg=PA90&dq=scala+operator+precedence+reference&source=bl&ots=FMlkUEDSpq&sig=pf3szEM4GExN_UCsgaxcQNBegPQ&hl=en&sa=X&ei=ZezQU_-SDszY7Ab-pIDQDQ&redir_esc=y#v=onepage&q=scala%20operator%20precedence%20reference&f=false

|的优先级低于/$的优先级最高,因此您的表达式被解释为:

(Query / "Pages") | (("ItemId" === 123) / (("Title" $ jsonFormat) $ ("Url" ==| "Bla")))

此外,提供确切的错误消息通常很有用。