首页 > 解决方案 > 提升类型上的模式匹配(Slick Lifted Embedding)

问题描述

如果我想对 Scala 中的基本选项类型进行模式匹配,我会按照以下方式运行

val opt = Option(5)
val lessThanTen = opt match {
    case Some(e) => if (e < 10) true else false
    case None => None
}

但是假设 opt 是 Slick 的一个查询的结果,因此具有提升嵌入类型,Rep[Option[Int]] 我如何以一种允许我们看到提升类型内部的方式执行相同的模式匹配?即类似的东西

val opt = Rep(Option(5))
val lessThanTen = opt match {
    case Rep[Some(e)] => Rep[if (e < 10) true else false]
    case Rep[None] => Rep[None]
}

但是,当然,可以编译的;)

标签: scalapattern-matchingslicklifting

解决方案


您可以使用该map方法对 a 的内容进行一些操作Rep

val rep: Rep[Option[Int]] = ???
val boolRep = rep.map {
    case Some(i) => Some(i < 10)
    case None => None
}

更好的是:Option和 Scala 中的许多其他集合类型一样,也有类似的map方法,所以你可以写

val boolRep = rep.map(_.map(_ < 10))

在那个表达式中,第一个_Option[Int],第二个是它Int本身。Option[Int]在is的情况下None,该map方法没有任何东西可以应用给定的函数,因此它None按定义返回。


推荐阅读