2013-07-24 21 views
2

我怎樣才能匹配無形變量的情況?如何將無形變量與大小寫匹配?

比方說,我有以下類型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對,這樣我就不必做單獨聲明?

回答

4

有方法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 

或者用替代語法unapplyTuple2結果: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 } 
+0

絕對真棒。非常感謝。 – expert

+0

要匹配類型,你可以這樣做:'case(a:String)::(b:String):: HNil => s「$ a :: $ b :: HNil」' – bbarker