簡體   English   中英

嘗試使用隱式 class 擴展它時,代表擴展方法不可用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM