byterat

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            54 隨筆 :: 0 文章 :: 15 評(píng)論 :: 0 Trackbacks

          有這樣一個(gè)函數(shù), 它接受一個(gè)函數(shù)(或者說(shuō)閉包)作為參數(shù):

          object Timer{
            def oncePerSecond(callback: () => unit): unit = {
              while (true){
                callback()
                Thread.sleep(1000)
              }
            }

            def timeFlies(): unit = { 
              Console.println("Time flies when you're having fun(ctionally)...");
            }

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

          觀察函數(shù)oncePerSecond, 它的參數(shù)callback被定義為" () => unit", 表示callback接受一個(gè)函數(shù), 并且這個(gè)函數(shù)
              1. 不能帶參數(shù); 因?yàn)?()"
              2. 返回值的類型為unit, 即沒(méi)有返回值; 因?yàn)? => unit", "=>" 表示返回值, "unit"表示返回值的類型

          再觀察函數(shù)timeFlies, 它滿足以上兩個(gè)條件, 因此, 可以這么調(diào)用: oncePerSecond(timeFlies)




          匿名函數(shù)

          更進(jìn)一步, 我們可以不用聲明函數(shù)timeFiles, 而直接將它的主體作為參數(shù)傳遞給oncePerSecond:

            def timeFlies(): unit = { 
              Console.println("Time flies when you're having fun(ctionally)...");
            }

            進(jìn)一步簡(jiǎn)化為匿名函數(shù), 或者說(shuō)是閉包, 或者說(shuō)是code block:

            () => Console.println("Time flies when you're having fun(ctionally)..."


            調(diào)用匿名函數(shù):

            oncePerSecond(() => Console.println("Time flies... oh, you get the idea."))




          更典型的例子


          觀察下面的scala代碼:

          object HelloWorld{
            def main(args: Array[String]): unit = {
              args.filter( (arg:String) => arg.startsWith("G") )
                  .foreach( (arg:String) => Console.println("Found " + arg) )
            }
          }


          1. 函數(shù)main的參數(shù)是Array類型的String數(shù)組 args: Array[String]
          2. Scala數(shù)組有一個(gè)方法filter, 方法filter(b)返回一個(gè)符合某個(gè)條件b的數(shù)組
             
              args.filter( (arg:String) => arg.startsWith("G") )

             和上面的匿名函數(shù)一樣, 紅色部分也是一個(gè)匿名函數(shù), 不同的是, 該函數(shù)接受一個(gè)String值,并且返回一個(gè)boolean值:
             
              (arg:String) => arg.startsWith("G")

              在args.filter()函數(shù)的圓括號(hào)內(nèi), arg:String 表示枚舉args中的每一個(gè)值. arg.startsWith("G")是Java的String類型的函數(shù), 因此, 這個(gè)匿名函數(shù)的含義是:
              從args中, 返回一個(gè)字符串?dāng)?shù)組, 并且這個(gè)字符串?dāng)?shù)組的字符串,都是以字符"G"開(kāi)頭的.

             和args.filter()一樣, foreach也是Scala數(shù)組的一個(gè)方法.








          posted on 2008-05-30 15:19 比特鼠 閱讀(3993) 評(píng)論(0)  編輯  收藏 所屬分類: Scala
          主站蜘蛛池模板: 石嘴山市| 柏乡县| 罗田县| 芜湖县| 东乡县| 奉贤区| 夏邑县| 东乌| 宁武县| 宜黄县| 新昌县| 淮南市| 嘉兴市| SHOW| 渭源县| 平远县| 顺昌县| 太原市| 双流县| 新乡县| 黄浦区| 庄浪县| 云安县| 四子王旗| 榆社县| 景泰县| 逊克县| 闻喜县| 绵竹市| 枣强县| 英德市| 陇川县| 长治县| 浦城县| 扶沟县| 文山县| 平潭县| 兴和县| 溧阳市| 天津市| 井研县|