有方法unapply
在對象shapeless.::
:
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 }
絕對真棒。非常感謝。 – expert
要匹配類型,你可以這樣做:'case(a:String)::(b:String):: HNil => s「$ a :: $ b :: HNil」' – bbarker