次の例を見てみましょう。最初の呼び出しの結果を一時的に保存してそれに対して照合するのではなく、エクストラクタが複数回呼び出されるのはなぜですか。unapply
同じ文字列が与えられた場合、結果は変わらないと仮定するのは合理的ではないでしょうか。
object Name {
val NameReg = """^(\w+)\s(?:(\w+)\s)?(\w+)$""".r
def unapply(fullName: String): Option[(String, String, String)] = {
val NameReg(fname, mname, lname) = fullName
Some((fname, if (mname == null) "" else mname, lname))
}
}
"John Smith Doe" match {
case Name("Jane", _, _) => println("I know you, Jane.")
case Name(f, "", _) => println(s"Hi ${f}")
case Name(f, m, _) => println(s"Howdy, ${f} ${m}.")
case _ => println("Don't know you")
}