Scala提取器应用,取消应用和模式匹配
时间:2020-02-23 14:41:46 来源:igfitidea点击:
Scala提取器是一个对象,其成员之一具有称为unapply的方法。
unapply方法匹配一个值并将其拆开。
提取器还定义了用于构建值的apply方法。
考虑一个提取使用空格作为分隔符的名字和姓氏的示例。
firstName.scala
object firstName { def main(args: Array[String]) { println("Apply method : " + apply("Steve", "Smith")); println("Unapply method : " + unapply("Steve Smith")); println("Unapply method : " + unapply("Rob")); } def apply(fname: String, lname: String) = { fname + " " + lname } def unapply(s: String): Option[(String, String)] = { val pts = s split " " if (pts.length == 2) { Some(pts(0), pts(1)) } else { None } } }
对象firstName定义了两个方法apply和unapply。
apply方法变成一个对象,该对象接受括号内指定的参数并构建该方法中指定的值。
返回的名字和姓氏以及两者之间的空格。
unapply方法将firstname对象返回到提取器中,并按方法中指定的方式断开参数。
unapply方法接受String参数,并以空格作为分隔符分割String并在成对的字符串中返回选项类型。
如果将名字和姓氏作为参数传递,则结果是一对字符串,否则不返回。
下图显示了以上scala程序产生的输出。
Scala提取器模式匹配
如果类的实例包含零个或者多个参数的列表,则编译器将对该实例调用apply方法。
可以为对象和类都定义apply方法。
考虑如下所示的示例;
patternmatch.scala
case class Student(name: String, address: Seq[Address]) case class Address(city: String, state: String) object City { def unapply(s: Student): Option[Seq[String]] = Some( for (c <- s.address) yield c.state) } class StringSeqContains(value: String) { def unapply(in: Seq[String]): Boolean = in contains value } object PatternMatch { def main(args: Array[String]) { val stud = List(Student("Harris", List(Address("LosAngeles", "California"))), Student("Reena", List(Address("Houston", "Texas"))), Student("Rob", List(Address("Dallas", "Texas"))), Student("Chris", List(Address("Hymansonville", "Florida")))) val Texas = new StringSeqContains("Texas") val students = stud collect { case student @ City(Texas()) => student.name } println(students) } }
在上面的示例中,我们定义了两个类Student和Address。
学生班包含姓名和地址,而地址包含城市和州。
在对象City中,我们定义了一个未应用的方法,该方法从地址列表中获取状态。
在PatternMatch对象中,我们创建Student和address的对象,并获取留在得克萨斯城的学生的姓名,这是要匹配的模式。