2013-07-24 4 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 для струнных пар, так что я не должен делать это в отдельном заявление ?

ответ

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 

Или с альтернативным синтаксисом для 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) 
} 

Alternative

Вы можете использовать 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

 Смежные вопросы

  • Нет связанных вопросов^_^