1

Quill使用中缀操作时遇到问题。
Scala2.12.4 Quill2.3.3

import io.getquill._
val ctx = new SqlMirrorContext(PostgresDialect, SnakeCase)
import ctx._

// infix for custom DB operation
implicit class StringQuotes(left: String) {
  def equalTest(right: String): Quoted[Boolean] = quote {
    infix"$left = $right".as[Boolean]
  }
}

case class User(name: String)

object User {
  // normal usage 
  def filter1() = quote {
    query[User]
      .filter(
        user => user.name == "Cool"
      )
  }
  //using infix for custom operation
  def filter2() = quote {
    query[User]
      .filter(
        user => user.name equalTest "Cool"
      )
  }
}
//pass, and generates a valid SQL.
ctx.run(User.filter1())

// fail
ctx.run(User.filter2())

错误消息是模糊的:

java.util.NoSuchElementException: value user
..... too long to show
Error while emitting main.scala

它只指出filter2是原因,并没有说哪一行错了。

Scastie在线编辑器上的可运行代码片段https://scastie.scala-lang.org/superChing/haYVkGLDSlKsOhYlaPdO1w

4

1 回答 1

2

Quoted[Boolean]它可以在函数中没有显式返回类型的情况下equalTest工作:

def equalTest(right: String) = quote {
    infix"$left = $right".as[Boolean]
}
于 2018-03-18T09:40:28.607 回答