尝试使用隐式 class 扩展时,代表扩展方法不可用?

Rep extension methods unavailable when trying to extend it with implicit class?

我正在尝试使用新方法 =?= 扩展 Slick Rep,该方法通过 Scala 的 implicit class:

作为扩展方法提供
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 中定义,但我找不到任何说明如何将其显式导入范围的文档 - 直接导入 class 本身。事实上,在我处理 Rep 类型的其余代码中,该 === 方法似乎在我需要时可以免费使用,无需任何特殊努力或显式导入。

在这种情况下,如何将 === 方法纳入范围?

扩展方法是通过 ExtensionMethodConversions 中的隐式定义为类型实现的(参见 ExtensionMethods.scala 的底部)。这意味着,要使 === 可用,隐式需要应用于您的类型 T。由于 T 不受约束,因此它不匹配任何将 === 纳入范围的隐式定义。

解决这个问题的一种方法是限制 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,如所述: -- 但看起来您不需要此定义。