快学Scala 第二十二课 (apply和unapply)

【快学Scala 第二十二课 (apply和unapply)】知识就是力量,时间就是生命。这篇文章主要讲述快学Scala 第二十二课 (apply和unapply)相关的知识,希望能为你提供帮助。
apply和unapply:
 
apply方法经常用在伴生对象中,用来构造对象而不用显式地使用new。
unapply是当做是伴生对象的apply方法的反向操作。apply方法接受构造参数,然后将他们变成对象。而unapply方法接受一个对象,然后从中提取值。unapply方法返回的是一个Option.

object ScalaRunner { def main(args: Array[String]): Unit = { testApply2() testApplyUnApply() testCaseClass() testNumber() testUnapplyCheck() }private def testUnapplyCheck(): Unit = { "Hello World fdf" match { case Name(first, last@IsCompound()) => println(s"first: ${first}, last: ${last}") } }private def testNumber() = { val Number(n) = "12345" println(s"n: ${n}") }private def testCaseClass(): Unit = { val p: Person = Person("Sky", 20) p match { case Person(name, 20) => println(s"name: ${name}") } }private def testApplyUnApply() { val nameObj = Name("hello", "world") println(s"a: ${nameObj.a}, b: ${nameObj.b}")val Name(arg11, arg12) = "Hello World" println(s"arg11: ${arg11}, arg12: ${arg12}")val Name(arg21, arg22) = Name("hello", "world").toString println(s"arg21: ${arg21}, arg22: ${arg22}")}private def testApply(): Unit = { Name() (new Name) () (new Name()) () Name()()}private def testApply2(): Unit = { Name(1) (new Name()) (1) (new Name) (1) Name(1)(1) } }case class Person(val name: String, val age: Int)object Number { def unapply(input: String): Option[Int] = { try{ Some(Integer.parseInt(input.trim)) } catch { case ex: NumberFormatException => None } }}class Name { var a = "" var b = ""def this(a: String, b: String){ this println("Call class construct.") this.a = a this.b = b }def apply() = { println("Call class apply.") }def apply(i: Int) = { println(s"Call class apply ${i}.") }override def toString: String = { a + " " + b }}object Name {def apply(): Name = { println("Call object apply.") new Name() }def apply(i: Int): Name = { println(s"Call object apply ${i}.") new Name() }def apply(a: String, b: String): Name = { println(s"Call object apply.") new Name(a, b) }def unapply(input: String): Option[(String, String)] = { println(s"Call object unapply.") val pos = input.indexOf(" ") if(pos == -1) None else Some((input.substring(0, pos), input.substring(pos + 1))) }}object IsCompound { def unapply(input: String) = { println(s"Call IsCompound unapply ${input}.") input.contains(" ") } }

运行结果:
快学Scala 第二十二课 (apply和unapply)

文章图片

 

    推荐阅读