Scala中的不区分大小写的模式匹配

3

我想在Scala中进行模式匹配,但需要忽略大小写。有没有一种方法可以在不使用单独的小写和大写'case'子句的情况下编写代码。

//person class with first name and last name
case class Person (var fn: String, val ln: String) {
  val name = fn
  val lastName = ln
}

//two instances. Same last name but cases are different
val a2 = Person("Andy","Cale")
val a3 = Person("Andy","cale")

def isCale(person:Person) {
person match {
//I want that this case should be case insensitive
  case Person(_,"Cale") => println("last-name Cale")
  case _ => println("not Cale")
}
}
isCale(a2) 
lastname Cale

//I want this to also match 
isCale(a3)
not Cale

一种替代方案是提取姓氏并进行比较,但我想知道是否有一种在案例本身中完成这个任务的方法。

def isCale(a2:A2) {
  val s = a2.ln

  s.toLowerCase match {
  case "cale" => println("last-name Cale")
  case _ => println("not Cale")
}

你的 case class 不太符合惯用法。case class 的所有参数/成员都应该是不可变的。总体而言,case class 主要用于表示不可变数据。如果你更喜欢使用具有 setter 的经典 JavaBean 类,最好使用普通类。 - marios
2个回答

4
您可以使用守卫(Guard):
def main(args: Array[String]): Unit = {
  case class Person(firstName: String, lastName: String)

  val p = Person("Yuval", "Itzchakov")
  p match {
    case Person(_, lastName) if lastName.equalsIgnoreCase("itzchakov") =>
      println(s"Last name is: $lastName")
    case _ => println("Not itzchakov")
  }
}

附带说明 - case class 参数将作为声明的类上的 val 附加,不需要额外的赋值,也不需要在构造函数中定义 val/var


2
您可以使用提取器:
scala> val r = "(?i:it.*ov)".r
r: scala.util.matching.Regex = (?i:it.*ov)

scala> case class Person(firstName: String, lastName: String)
defined class Person

scala> val ps = Person("Fred", "Itchikov") :: Person("Yuval", "Itzchakov") :: Nil
ps: List[Person] = List(Person(Fred,Itchikov), Person(Yuval,Itzchakov))

scala> ps collect { case Person(_, n @ r()) => n }
res0: List[String] = List(Itchikov, Itzchakov)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接