【问题标题】:Scala Quill error when using infix使用中缀时出现 Scala Quill 错误
【发布时间】:2018-03-18 07:51:38
【问题描述】:

我在使用Quill的中缀操作时遇到问题。
Scala 2.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的可运行代码sn-p

【问题讨论】:

    标签: scala dsl scala-macros quill.io


    【解决方案1】:

    它在 equalTest 函数中无需显式返回类型 Quoted[Boolean] 即可工作:

    def equalTest(right: String) = quote {
        infix"$left = $right".as[Boolean]
    }
    

    【讨论】:

    • 你有理由或文档吗?
    • 我认为 Quoted 只能存在于上下文中,但您的 Quoted 返回类型是无限的。但是如果你省略它,神秘的 Scala 会干扰你正确的引用返回类型:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多