2015-02-24 4 views
1

Кто-нибудь знает, если есть короткий способ сделать это без прохождения каждого значения:Transform результат Scala Regex.unapplySeq(), чтобы кортеж

case class Person(title: String, first: String, last: String) 

val name = """(Mr|Mrs|Ms)\. ([A-Z][a-z]+) ([A-Z][a-z]+)""".r 
val name(title, first, last) = "Mr. James Stevens" 

Person.tupled((title, first, last)) 

Я ищу способ, чтобы получить в результате regex как кортеж, чтобы передать его непосредственно Person.tupled().

Спасибо, Торбена

ответ

0

Это не вполне возможно, как unapplySeq возвращает List. Для рассуждений и некоторых возможностей см. this SO question on list to tuple.

Лучшее решение, вероятно, будет шаблону

Person.tupled(nameString match { 
    case name(first, middle, last) => (first, middle, last) 
}) 
0

Вы можете написать свой собственный экстрактор для этого:

object NameRegex { 
    private val name = """(Mr|Mrs|Ms)\. ([A-Z][a-z]+) ([A-Z][a-z]+)""".r 
    def unapply(x: String) = name.unapplySeq(x).collect { 
     case(List(title, first, last)) => (title, first, last) 
    } 
} 

И тогда вы могли бы сделать

val NameRegex(tuple) = "Mr. Charles Darwin" 
Person.tupled(tuple) 

Или:

"Mr. Ben Reich" match { 
    case NameRegex(tuple) => Person.tupled(tuple) 
} 

Или вы могли бы сделать матч NameRegex объекта к Person объекта:

object NameRegex { 
    private val name = """(Mr|Mrs|Ms)\. ([A-Z][a-z]+) ([A-Z][a-z]+)""".r 
    def unapply(x: String) = name.unapplySeq(x).collect { 
     case(List(title, first, last)) => Person(title, first, last) 
    } 
} 

Итак вы можете извлечь класс человек случай в один шаг:

val NameRegex(p) = "Mr. Barack Obama" //p is Person("Mr", "Barack", "Obama") 
val NameRegex([email protected](title, first, last)) = "Mr. Barack Obama" 
Смежные вопросы