前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(2) - apply, update 语法糖

(2) - apply, update 语法糖

作者头像
codingforfun
发布2018-08-24 15:07:40
2860
发布2018-08-24 15:07:40
举报

语法糖,又称为糖衣语法,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说可以增加程序的可读性,从而减少程度代码出错的机会。接下来就会介绍两个 Scala 中的语法糖。

在 Scala 中,如果我们要频繁调用某个 class 或 object 的方法,我们可以通过定义 apply 方法来避免每次写出该函数的调用,而使用一种更加简洁的方式,来看下面的例子:

不使用 apply 方法

代码语言:javascript
复制
scala> class truck {
     |   def transport( goods: Int ): Unit = {
     |     println( "truck transport " + goods + "t goods" )
     |   }
     | }
defined class truck

scala>     val t = new truck
t: truck = truck@77468bd9

scala>     t.transport( 100 )
truck transport 100t goods

使用 apply 方法

代码语言:javascript
复制
scala> class truck {
     |   def apply( goods: Int ): Unit = {
     |     println( "truck transport " + goods + "t goods" )
     |   }
     | }
defined class truck

scala>

scala> val t = new truck
t: truck = truck@68bbe345

scala> t(100)
truck transport 100t goods

上面两个例子的效果是完全一样的,下面这个定义了 apply 的类能让我们在频繁调用某个方法的时候更加方便。当然,apply 方法支持任意类型和任意个参数。

另一种 apply 常用的使用场景是用 object 来创建其伴生类的实例。如下例:

代码语言:javascript
复制
private class truck {
  println( "new truck created!" )
}

object truck {
  def apply(): Unit = {
    new truck
  }
}

object TT {
  def main (args: Array[String]) {
    val t = truck()
  }
}

输出:

代码语言:javascript
复制
new truck created!

其实上例中,truck()就是调用了truck.apply()方法,编译器在编译时将truck()编译成truck.apply(),如果你对编译后的结果进行反编译就能验证这一点,这留给有兴趣的同学自行实践,这里不展开了。

apply 方法在我们平时写代码时也经常碰到,比如:

代码语言:javascript
复制
val l = List(1,2,3)

中的 List(1,2,3) 调用就是调用的 object List 的 apply 方法


除了 apply 方法,还有一个用于赋值时的 update 方法,

代码语言:javascript
复制
scala> val a = mutable.Map[ Int, Int ]()
a: scala.collection.mutable.Map[Int,Int] = Map()

scala> a(1) = 1

scala> println( a )
Map(1 -> 1)

当我们调用 a(1) = 1 的时候其实是在调用 a.update(1,1),当然你也可以在自定义类中实现 update 使调用更方便。就像下面这个例子一样

代码语言:javascript
复制
scala> class A {
     |   private var a = 0
     |
     |   def update( i: Int ): Unit = {
     |     a = i
     |     println( a )
     |   }
     | }
defined class A

scala> val a = new A
a: A = A@27e47833

scala> a() = 2
2

**传送门: **Scala 在简书目录


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.05.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档