如何进行模式匹配以匹配最后一个元素的所有元素?
例如,假设我有这个unapplySeq:
object MyObject {
def unapplySeq(money: String): Option[List[Char]] = {
val amount = money.trim.toList
if (amount.isEmpty) None
else
Some(amount)
}
}
我尝试以下比赛:
"12.15 €" match {
case MyObject('$' , last @ _*) => s"${last.mkString} dollars"
// this is wrong
case MyObject(first @ _*, '€') => s"${last.mkString} euro"
case _ => "Unknown format"
}
我可以为美国金额执行此操作,例如我传给$ 120.10,但是如何重写第二种情况以匹配符号在末尾的欧元字符串?
答案 0 :(得分:2)
使用Regex
这将非常简单def currency(s: String) {
val dollar = """\$(.+)""".r
val euro = """(.+)€""".r
s match {
case dollar(amt) => println(amt + " dollars")
case euro(amt) => println(amt + " euros")
case _ => println("unknown currency")
}
}
scala> currency("$1346.00")
1346.00 dollars
scala> currency("1346.00€")
1346.00 euros
答案 1 :(得分:1)
可能,正则表达式过度表达" startsWith"和" endsWith"。
一个简单的提取器完成这项工作,但是让字符串完成它是一个低于字符串列表的缺口。
scala> object Currency { def unapply(s: String): Option[(Char, String)] =
| if (s.head == '$') Some('$',s.tail)
| else if (s.last == '€') Some('€',s.init) else None }
defined object Currency
scala> def currency(s: String) = s match { case Currency(c, amt) => s"$amt of $c" case _ => "unknown" }
currency: (s: String)String
scala> currency("$120.10")
res2: String = 120.10 of $
scala> currency("1346.00€")
res3: String = 1346.00 of €
毫无疑问,您真的会提取货币枚举和数字。