您所在的位置:开发 > Java > Java+ > Inside Scala:王在祥的Scala学习笔记(1)

Inside Scala:王在祥的Scala学习笔记(1)

2009-11-16 17:04 王在祥 Wang Zai Xiang 字号:T | T
一键收藏,随时查看,分享好友!

本文是王在祥先生的Scala学习博文系列。在这个系列中,王在祥先生分篇讲述了Scala中的一些有意思的语言特性,如curry,case类,模式匹配等等。

AD:

编者注:本系列来自王在祥先生的博客,主要是分篇总结了对于Scala一些语言特性的心得,为了便于与大家分享而在此转载。这个系列适合对Scala以及函数式语言有一定了解的开发者阅读。

51CTO编辑推荐:Scala编程语言专题

Inside Scala - 1:Partially applied functions

Partially applied function(不完全应用的函数)是scala中的一种curry机制,本文将通过一个简单的实例来描述在scala中 partially applied function的内部机制。

  1. // Test3.scala  
  2. package test  
  3.  
  4. object Test3 {  
  5.  
  6.   def sum(x:Int, y:Int, z:Int) = x + y + z  
  7.     
  8.   def main(args: Array[String]) {  
  9.     val sum1 = sum _  
  10.     val sum2 = sum(1, _:Int, 3)  
  11.     println(sum1(1,2,3))  
  12.     println(sum2(2))  
  13.     List(1,2,3,4).foreach(println);  
  14.     List(1,2,3,4).foreach(println _)  
  15.   }  
  16.  
  17. }  
  18.  

在这个代码中 sum _ 表示了一个 新的类型为 (Int,Int,Int)=>Int 的函数,实际上,Scala 会生成一个新的匿名函数(是一个函数对象,Function3),这个函数对象的apply方法会调用 sum 这个对象方法(在这里,是方法,而不是一个函数)。
sum2 是一个 Int => Int的函数(对象),这个函数的apply方法会调用 sum 对象方法。
后面的两行代码都需要访问 println, println是在在Predef对象中定义的方法,在scala中,实际上都会生成一个临时的函数对象,来包装对 println 方法的调用。如果研究一下scala生成的代码,那么可以发现,目前生成的代码中, 对 println, println _生成的代码是重复的,这也说明,目前,所有的你匿名函数基本上没有进行重复性检查。(这可能导致编译生成的的类更大)。

从这里可以得知,虽然,在语法层面,方法(所有的def出来的东西)与函数看起来是一致的,但实际上,二者在底层有区别,方法仍然是不可以直接定位、传值的,他不是一个对象。而仅仅是JVM底层可访问的一个实体。而函数则是虚拟机层面的一个对象。任何从方法到函数的转换,Scala会自动生成一个匿名的函数对象,来进行相应的转换。

所以, List(1,2,3,4).foreach(println) 在底层执行时,并不是获得了一个println的引用(实际上,根本不存在println这个可访问的对象),而是scala自动产生一个匿名的函数,这个函数会调用println。

当然,将一个函数传递时,Scala是不会再做不必要的包装的,而是直接传递这个函数对象了。

内容导航
 第 1 页:Partially applied functions  第 2 页:Curry Functions
 第 3 页:How Trait works  第 4 页:Trait Stacks
 第 5 页:Trait Stacks(续)  第 6 页:Case Class 与 模式匹配
 第 7 页:Scala Actor机制分析



分享到:

关于Inside Scala的更多文章
Scala编程语言

Scala是一种针对 JVM 将函数和面向对象技术组合在一起的编程语言[详细]

热点职位

更多>>

热点专题

更多>>

读书

超级网管员——网络基础
本书全面系统地概括了计算机网络的基本理论,详细阐述了OSI模型与网络协议、网络规划与综合布线、对等网络与服务器/客户端网络、

最新热帖

更多>>

51CTO旗下网站

领先的IT技术网站 51CTO 领先的中文存储媒体 WatchStor 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i