scala - 如何将大小写与无形变量匹配?

标签 scala shapeless

如何将大小写与无形变量匹配?

假设我有以下类型的变量 shapeless.::[String,shapeless.::[String,shapeless.HNil]]

目前我必须这样做

authHeaders.hrequire(shape_value => {
    val (client_id, client_secret) = value.tupled
    isAuthorized(client_id, client_secret)
  }
  )

我可以以某种方式将 String::String::HNil 展开为 String 对,这样我就不必在单独的语句中执行此操作吗?

最佳答案

对象shapeless.::中有方法unapply:

def unapply[H, T <: HList](x: H :: T): Option[(H, T)]

所以你可以像这样在 HList 上进行匹配:

scala> val ::(a, ::(b, HNil)) = "1" :: "x" :: HNil
a: String = 1
b: String = x

或者使用 unapply 方法的替代语法和 Tuple2 结果:a::b 而不是 ::(a, b ):

scala> val a :: b :: HNil = "1" :: "x" :: HNil
a: String = 1
b: String = x

scala> "1" :: "x" :: HNil match {
     |   case a :: b :: HNil => s"$a :: $b :: HNil"
     | }
res0: String = 1 :: x :: HNil

就您而言:

authHeaders.hrequire{
  case client_id :: client_secret :: HNil => isAuthorized(client_id, client_secret)
}

替代方案

您可以使用tupled方法将N个参数的函数转换为单个TupleN参数的函数。

对于功能:

val isAuthorized: (String, String) => Boolean = ???
authHeaders.hrequire{ isAuthorized tupled _.tupled }

对于方法:

def isAuthorized(s1: String, s2: String): Boolean = ???
authHeaders.hrequire{ (isAuthorized _) tupled _.tupled }

关于scala - 如何将大小写与无形变量匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17825474/

相关文章:

scala - 运行时值的精炼和存在类型

scala - 用 Shapeless 扑灭 Arities 的篝火?

scala - 如何在 scala shapeless 中显示 HList 的类型

scala - playframework 多个端口

java - Jenkins 在 Scala 失败时报告成功

scala - 如何通过Scala Spark-Shell将大RDD写入本地磁盘?

scala - 当将 HList 与 GADT 一起使用时,我必须使用 asInstanceOf[H] 进行转换。有没有办法避免 Actor 阵容?

scala - 文件系统提供程序在 Spark 中消失?

json - 使用 json4s 解析 JSON 中的空值

database - 在客户端和服务器之间共享的代码中表示 DB 实体的惯用方式