尝试使用隐式 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
,如所述: -- 但看起来您不需要此定义。
我正在尝试使用新方法 =?=
扩展 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
,如所述: