【问题标题】:Extended methods on Boolean value class wrapper布尔值类包装器上的扩展方法
【发布时间】:2017-11-07 19:34:18
【问题描述】:

在我的代码库中,我使用标签将一些信息编码为类型。由于标签使用t.asInstanceOf[T @@ U] 工作,我可以摆脱在包装和未包装值之间编写映射的许多麻烦。

最近我用标记类型碰壁了,因为它们破坏了我想使用的无形中的一些功能,所以我尝试使用值类。

到目前为止,我可以作弊一些,例如使用以下方式对标记类型进行布尔检查:

implicit class TaggedBooleanAsFirstOperand[P1, U](val c: Rep[P1 @@ U]) {
    private val em = new BooleanColumnExtensionMethods[P1](c.asInstanceOf[Rep[P1]])
    type o = OptionMapperDSL.arg[Boolean, P1]

    def @&&[P2, R](b: Rep[P2])(implicit om: o#arg[Boolean, P2]#to[Boolean, R]): Rep[R] = em.&&[P2, R](b)
    def @||[P2, R](b: Rep[P2])(implicit om: o#arg[Boolean, P2]#to[Boolean, R]): Rep[R] = em.||[P2, R](b)
    def unary_! : Rep[P1] = em.unary_!
  }

  implicit class TaggedBooleanAsSecondOperand[P1](val c: Rep[P1]) {
    private val em = new BooleanColumnExtensionMethods[P1](c)
    type o = OptionMapperDSL.arg[Boolean, P1]

    def &&@[P2, U, R](b: Rep[P2 @@ U])(implicit om: o#arg[Boolean, P2]#to[Boolean, R]): Rep[R] = em.&&[P2, R](b.asInstanceOf[Rep[P2]])
    def ||@[P2, U, R](b: Rep[P2 @@ U])(implicit om: o#arg[Boolean, P2]#to[Boolean, R]): Rep[R] = em.||[P2, R](b.asInstanceOf[Rep[P2]])
  }

  implicit class TaggedBooleanAsBothOperands[P1, U](val c: Rep[P1 @@ U]) {
    private val em = new BooleanColumnExtensionMethods[P1](c.asInstanceOf[Rep[P1]])
    type o = OptionMapperDSL.arg[Boolean, P1]

    def @&&@[P2, V, R](b: Rep[P2 @@ V])(implicit om: o#arg[Boolean, P2]#to[Boolean, R]): Rep[R] = em.&&[P2, R](b.asInstanceOf[Rep[P2]])
    def @||@[P2, V, R](b: Rep[P2 @@ V])(implicit om: o#arg[Boolean, P2]#to[Boolean, R]): Rep[R] = em.||[P2, R](b.asInstanceOf[Rep[P2]])
  }

但是,使用AnyVal,我不能简单地将一种类型转换为我想要的另一种类型,我必须提供一些诚实的代码来实现我想要的。

我尝试阅读 Slick 源代码,但我应该从哪里开始的整个想法对我来说有点模糊 - 相关信息分布在很多地方,所以我不能简单地指出几个地方,例如弄清楚如何将一个 Rep 映射到另一个或从包装和未包装的布尔值中提取数据并将它们组合起来。

一些 Slick 专家可以推荐一些好的起点吗?

【问题讨论】:

    标签: scala slick-3.0 value-class


    【解决方案1】:

    标签实际上不仅为您提供类型安全。它也为您提供抽象级别。一旦你将boolean 包装成tag,你就可以从你的布尔值的运行时表示中抽象出来。顺便说一句,您应该使用Tag.unwrapTag.unsubst 而不是asInstanceOf。 Slick 在较低的抽象级别上工作。它适用于 SQL 知道的简单类型。 当然,在使用 DB 之前,您需要在两者之间添加 unwrap 标签。 我会将它封装在表模式中。请参阅映射表部分:http://slick.lightbend.com/doc/3.0.0/schemas.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 2020-07-17
      • 2013-10-04
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      相关资源
      最近更新 更多