如何将大小写与无形变量匹配?
假设我有以下类型的变量 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/