[英]Rep extension methods unavailable when trying to extend it with implicit class?
我正在嘗試使用新方法=?=
通過Scala的implicit class
作為擴展方法提供來擴展 Slick Rep
:
import slick.ast.TypedType
import slick.lifted.LiteralColumn
import slick.lifted.Rep
object RepExtensions {
implicit class RichRep[T](rep: Rep[T]) {
def =?=(rhs: Option[T])(implicit tt: TypedType[Boolean]): Rep[Boolean] =
rhs.map(rep === _).getOrElse(LiteralColumn[Boolean](true))
}
}
但是在這種情況下,由於我無法識別的原因,方法===
對編譯器不可見:
[error] /Users/.../RepExtensions.scala:10:19: value === is not a member of slick.lifted.Rep[T]
[error] rhs.map(rep === _).getOrElse(LiteralColumn[Boolean](true))
[error]
===
方法在 Slick 的ColumnExtensionMethods
中定義,但我找不到任何文檔解釋如何將其顯式導入 scope - 直接導入 class 本身當然無濟於事。 實際上,在我處理Rep
類型的代碼的 rest 中, ===
方法似乎在我需要時可以免費使用,無需任何特殊努力或顯式導入。
在這種情況下,如何將===
方法放入 scope 中?
擴展方法是通過ExtensionMethodConversions
的底部)。 這意味着, ===
可用,隱式需要應用於您的類型T
。 由於T
不受約束,它不匹配任何將===
帶入 scope 的隱式定義。
解決該問題的一種方法是將T
約束為匹配。 例如:
import slick.ast.BaseTypedType
import slick.jdbc.H2Profile.api._ // or whichever database you use
object RepExtensions {
implicit class RichRep[T : BaseTypedType](rep: Rep[T]) {
def =?=(rhs: Option[T]): Rep[Boolean] =
rhs.map(rep === _).getOrElse(LiteralColumn[Boolean](true))
}
}
下一步是需要一個Shape
,如下所述: https://stackoverflow.com/a/43014901/154248 - 但看起來你不需要這個定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.