提升类型上的样式匹配(平滑提升嵌入)

时间:2019-10-08 22:25:10

标签: scala pattern-matching slick lifting

如果我想在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]
}

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

1 个答案:

答案 0 :(得分:1)

您可以使用map方法对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]None的情况下,map方法没有任何可应用给定功能的方法,因此它按定义返回None