Scala<apply的几种用法>

1.只是一个快捷方式

首先定义个object:

object Greet {
  def apply(name: String): Unit = {
    println("Call From %s".format(name))
  }
}
object Main {
  def main(args: Array[String]): Unit = {
    Greet.apply("Gpwner")
    println("==========================")
    Greet("pwner")
  }
}

控制台输出:
这里写图片描述


所以当调用一个Object的时候,其实就是相当于调用了这个Object的apply方法

但是apply并不等同与构造函数

这里写图片描述

2.scala会自动为case class 生成apply方法

下面的三个操作都是一样的结果:

val p0 = new Person("Frank", 23, "Blue") // normal constructor

val p1 = Person("Frank", 23, "Blue") // this uses apply

val p2 = Person.apply("Frank", 23, "Blue") // using apply manually

这里写图片描述

3、apply应用于builder模式

一个object中的apply方法不一定要返回其自身对象,比如

case class Company(name: String)

class Person(val name: String) {}

object Person {
  def apply(name: String): Company = new Company(name)
}

当调用Person的apply的时候返回的是Company对象

这里写图片描述

利用这个特点我们可以将一个类写成Builder

abstract class DatabaseDriver {
  // some database stuff
}

object DatabaseDriver {
  def apply(config: Configuration) = config.dbType match {
    case "MYSQL" => new MySqlDriver()
    case "PSQL" => new PostgresDriver()
    case _ => new GenericDriver()
  }
}

// now I get the right version!
val mydatabase = DatabaseDriver(dbConfig)

4、apply应用于匿名函数

两个语句一样的结果:
这里写图片描述

5、在class中的apply

可以在object中有apply方法,当然也在class中定义apply方法

class Amazing {
  def apply(x: String) = "Amazing %s!".format(x)
}

// look how cool this is
val amazing = new Amazing()
amazing("world")
// => Amazing world!
amazing.apply("world")
// => Amazing world!

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值