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)的更多相关文章

  1. 快学Scala 第十二课 (抽象类, 抽象字段, 提前定义)

    抽象类: Scala 抽象类中,抽象方法不需要使用abstract. 在子类中重写超类抽象方法时,不需要使用override. abstract class Person { def say(s: S ...

  2. 快学Scala 第十九课 (trait的abstract override使用)

    trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super ...

  3. 快学Scala 第二十课 (trait的构造顺序)

    trait的构造顺序: 首先调用超类构造器 特质构造器在超类构造器之后,类构造器之前执行 特质从左向右被构造 每个特质当中,父特质先被构造 如果多个特质共有一个父特质,而那个父特质已经被构造,则不会被 ...

  4. 快学Scala 第十四课 (读取行,读取字符, 控制台读取)

    读取行: import scala.io.Source object FileReader { def main(args: Array[String]): Unit = { val source = ...

  5. 快学Scala 第十八课 (trait多继承)

    trait多继承: trait的继承并不像类拥有相同的含义!在下面这个例子中,如果还是运用类的继承的思想,那么运行结果将是什么也没有. trait Logged { def log(msg: Stri ...

  6. 快学Scala 第十六课 (shell调用,正则表达式,正则表达式组,stripMargin妙用)

    shell调用:(管道符前加#号,执行shell用!) import sys.process._ "ls -al" #| "grep x" ! 正则表达式:(r ...

  7. 快学Scala 第十五课 (二进制读取文件,写文件,访问目录,序列化)

    二进制读取文件: val file = new File("F:\\scalaWorkspace\\ScalaLearning\\files\\test.txt") val in ...

  8. NeHe OpenGL教程 第二十二课:凹凸映射

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  9. 快学Scala 第二课 (apply, if表达式,循环,函数的带名参数,可变长参数,异常)

    apply方法是Scala中十分常见的方法,你可以把这种用法当做是()操作符的重载形式. 像以上这样伴生对象的apply方法是Scala中构建对象的常用手法,不再需要使用new. if 条件表达式的值 ...

随机推荐

  1. 牛客暑假多校第五场 I vcd

    这个题目一个队友没读懂, 然后我读错了题目, 还让他堆了半天的公式写了半天的代码, 交上去一直0.0, 另一队友问题目有没有读错, 我坚持没有读错, 然后坑了2个小时的时间,不然应该会早一点做出来. ...

  2. 手工释放服务器的swap分区缓存

    时间     恢复时间 状态 信息 主机 问题 • 严重性 持续时间 确认 动作 2019-03-21 20:29:30     09:51:30     -ai-代理 Lack of free sw ...

  3. linux 常用压缩、解压命令

    .tar.gz     解压为          tar   -zxvf   xx.tar.gz    压缩为 tar -zcvf  target.tar.gz ./src_dir zip 解压为   ...

  4. Android的消息循环与Handler机制理解

    一.概念 1.事件驱动型 什么是事件驱动?就是有事了才去处理,没事就躺着不动.假如把用户点击按钮,滑动页面等这些都看作事件,事件产生后程序就执行相应的处理方法,就是属于事件驱动型. 2.消息循环 把需 ...

  5. valueForKey与valueForKeyPath 区别

    1.删除数组中重复的数据 2.valueForKeyPath:可以深层次取到子属性,不管隐藏的多深  valueForKey:无法取到深层次子属性 但是也有其相似的地方: 比如:快速找到字典数组中ke ...

  6. jmeter 查看结果树数据分析 优化

    1.点击查看结果树,配置 2.筛选功能项

  7. charles 端口转发

    本文参考:charles 端口转发 端口转发 端口转发(Port forwarding),有时被叫做隧道,是安全壳(SSH) 为网络安全通信使用的一种方法.端口转发是转发一个网络端口从一个网络节点到另 ...

  8. 控制执行流程之break和continue

    1.在任何迭代语句的主体部分,都可以用break和continue来控制程序执行流程. 2.注意: break:用于强行退出循环, 不执行循环中剩余的语句:continue:停止当前的循环,执行下一次 ...

  9. 第1次作业-Numpy练习

    1.创建一个边界值为1而内部都是0的数组,图例如下:[提示:]解此题可以先把所有值都设置为1,这是大正方形:其次,把边界除外小正方形全部设置为0.本题用到numpy的切片原理.多维数组同样遵循x[st ...

  10. 44 (OC)* 野指针、空指针

    一: 空指针 : 没有存储任何内存地址的指针就称为空指针(NULL指针). 被赋值为nil的指针,在没有被具体初始化之前,为nil.nil.Nil.NULL.NSNULL的含义和区别 nil:OC中的 ...