`
wwweducn
  • 浏览: 29510 次
文章分类
社区版块
存档分类
最新评论

函数、匿名-Scala 学习笔记(二)— Everything is an object -by小雨

阅读更多

新手发帖,不太懂规矩,有错误的地方请大家见谅,欢迎批评指正

    Everything is an object

    媒介

    Scala is a pure object-oriented language in the sense that everything is an object,including numbers or functions. It differs from Java in that respect, since Java distinguishes primitive types (such as boolean and int) from reference types, and does not enable one to manipulate functions as values.

    
Numbers are objects
Since numbers are objects, they also have methods.
例如,算式 1 + 2*3 / x,若将每个number都写成对象的方法,则为
.+(((2).*(3))./(x))
括号在式子中是必须的,因为如果写成1.+(2)的话,scala的词法分析器会这样断句:
+    2
如此一来,面前的“1.”就会被成当“1.0”,这样计算出来的结果就是double类型的据数了。例如:

如果是按范规写成(1).+(2)的话,就还是int类型的据数

之所以用这么矫情的写法,重要是为了说明number在scala中也是object,它有拥".+"方法。Scala也是可以用更切近时平习气的算式写法的:

    
Functions are objects
对java程序员来讲,更鲜新的一点就是function也是object。这以为着function也可以成当value一样停止递传。
Functions are also objects in Scala.It is therefore possible to pass functions as arguments, to store them in variables, and to return them from other functions.
对C语言还有印象的人应当还记得call-back function(回调函数)这个货色。它其实就相当于把函数做当值来递传了,不过在C中递传的是这个函数的地址。
看看上面这段代码:

object Timer {
    def oncePerSecond(callback: () => Unit) {
        while(true) { callback(); Thread sleep 1000 }
    }
    def timeFlies() {
        println("time flies like an arrow...")
    }

    def main(args: Array[String]) {
        oncePerSecond(timeFlies)
    }
}

可以看到,timeFlies函数被做当回调函数册注给了oncePerSecond。这类方法跟C很像。不过,这面里其实有点费浪,因为timeFlies函数其实基本不需要名字,因为它只在一个特定的地方用到了。如果把它象想成“一团货色”,那么只要把“这团货色”塞到它应当待的位置可即,基本不会再有别人关怀它叫什么名字(像好有点伤感……)
这样,就产生了anony-mous functions(匿名函数),如下:

object TimerAnonymous {
    def oncePerSecond(callback: () => Unit) {
        while(true) { callback(); Thread sleep 1000 }
    }
    def main(args: Array[String]) {
        oncePerSecond(() => println("time flies like an arrow..."))
    }
}

可以看到() =>println("time flies like an arrow...")这团货色”(是实其一个匿名函数)被做当一个object,直接塞到了使用它的地方。这个做法跟javascript的匿名函数很像,但是无论在有C中还是java中都是挺难象想的。Scala以可就这么做。

    结总:
Scala在java的基础之上,将面向对象的“万物皆为对象”的想思更推进了一步,把function也视为object,许允它作为数参涌现,也许允它被赋值给一个变量,甚至还行运它作为一个返回值来停止回馈。

文章结束给大家分享下程序员的一些笑话语录: 话剧:程序员过沟
  本剧内容纯属虚构,如有雷同……HEHE……俺也没办法了。
  话说某市街道改建,某某软件公司门口横七竖八挖了几条大沟。一群程序员(SDK程序员赵某,VB程序员钱某,VC程序员孙某,DELPHI程序员李某)下班从公司里出来,看到门前的几条沟,于是各显神通……门前第一条沟也就半米来宽,SDK程序员赵某二话没说,轻轻一跃跳了过去,看到其它人纷纷把随身携带的公文包(类库)横在沟上踩着过沟,不屑地说,这么小一条沟,犯得着小题大做用那个吗?看我多么轻松多么洒脱多么……多么……(众人皆怒目横视之……)
  接着第二条沟有点宽度。SDK程序员赵某还是还是一马当先,飞跃而起……不好,还差一点才到……幸好凭着多年的(跳远?编程?)经验,单手抓住沟沿,颤巍巍地爬了上来,嘴里还念念有词“高手就是高手啊,虽然差一点就……不过毕竟……HEHE……跳远是过沟的基础嘛,有基础(SDK)就有一切的说……”(众人作瞠目结舌状……)看到别人跳过去了,可自己又跳不了那么远,只好再想办法了……VB程序员钱某,DELPHI程序员李某打开手提,连上手机,开始上网找可供过沟的控件……VC程序员孙某却不慌不忙,打开公文包,把几块衬板拆了下来,然后三下五除二拼成一个简易木桥……“虽然这几个板子(类)做得不怎么样,不过先把这个项目应付过去,有时间我自己做一个好了……”于是踩着板子过了沟。
  这时钱某和李某也分别找到了合适的东东。钱某找到的是“钢丝绳.ocx”,安装简单,使用方便,拉出一头,对孙某说“大虾,顺手拉兄弟一把……”,于是把绳子系在沟两边的绿化树木上,踩着钢丝就过了沟。刚刚站稳就四方作揖,“小生这里有礼了”。这时一戴着黄袖圈的老太太跳了出来,抓住钱某,“破坏绿化树木,罚款XXXX元,交钱,交钱,交钱!”(老人家作双枪老太婆怒视伪军状
……钱某被逼无奈,只好边掏钱,边对着后台叫道“导演,我这可是因公牺牲,不给个烈士称号也得报销”,后台一个臭鸡蛋飞出,“叫什么叫,我这个月的粮饷还不知哪里去领呢,都什么时代了,你不下岗都不错了……”)
  李某看着刚刚好不容易从台湾拖回来的“铝条.ZIP”

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics