2016-12-18 12 views
3

スカラでパターンマッチングを行いたいが、大文字と小文字を区別しないでください。私は下と上ケースのために別々の「ケース」句を使用せずに、コードを書くことができますが道Scalaで大文字と小文字を区別しないパターン一致

//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 

一つは、代替は、姓を抽出し、次のように比較することですが、そこにある場合、私は見つけることに興味がありますされます場合によってはこれを行う方法。 - クラスパラメータが宣言されたクラスのval Sとして添付される場合、追加の割り当てとvalが不要のための必要はありません

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") 
    } 
} 

サイドノート:あなたはガードを使用することができます

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

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

あなたのケースクラスは非常に慣用的ではありませんが。考え方は、ケースクラスのすべての引数/メンバーは不変でなければならないということです。全体的に、ケースクラスは主に不変データを表現するために存在します。クラシッターJavaBeanのようなクラスをセッターで使用したい場合は、通常のクラスを使用することをお勧めします。 – marios

答えて

4

/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) 
関連する問題