scala - 提升类型上的模式匹配(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]
}
但是,当然,可以编译的;)
解决方案
您可以使用该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
按定义返回。
推荐阅读
- jwt - Keycloak - 您可以向客户端凭据添加自定义声明吗?
- ethereum - 从 github.com 上的 openZeppelin 合约导入哪个版本的 safeMath?
- c# - 在 C# 中打印字符之间的空格以回答刽子手游戏
- talend - 如何将列附加到 Talend 中的其他列?
- typescript - 无法检查传递给 Jest 模拟对象的参数
- css - React-Native 和 Styled Components 性能问题
- python - 设计异常继承的标准方法是什么?
- c++ - 在编译期间分配和更改数据类型 (c++)
- vue.js - Vuex-页面在提交状态更改后未更新
- token - node-red 通过带有令牌的 http 上传附件(多部分/表单数据)