鍍金池/ 教程/ Scala/ 函數(shù)–函數(shù)–可變參數(shù),命名參數(shù),缺省參數(shù)
包對象
Ordered Trait
組合和繼承–定義 final 成員
基本數(shù)據(jù)類型
Match 表達式
類和對象 (三)
操作基本數(shù)據(jù)類型
for 表達式
組合和繼承–重載成員函數(shù)和方法
類和對象 (二)
組合和繼承–定義 factory 對象
組合和繼承–多態(tài)和動態(tài)綁定
Trait 的基本概念
if 表達式
組合和繼承–抽象類
函數(shù)–函數(shù)字面量的一些簡化寫法
while 循環(huán)
組合和繼承–使用組合還是繼承?
訪問控制修飾符
Trait 示例–Rectangular 對象
組合和繼承–定義參數(shù)化成員變量
組合和繼承–定義無參數(shù)方法
類和對象 (一)
函數(shù)–閉包
函數(shù)–類成員函數(shù)
Scala 基本數(shù)據(jù)類型的實現(xiàn)方法
try 表達式處理異常
選擇瘦接口還是胖接口設(shè)計?
組合和繼承–小結(jié)
創(chuàng)建新的控制結(jié)構(gòu)
使用 import
為訪問控制修飾符添加作用域
Scala 的類層次關(guān)系
類和對象 (五)
傳名參數(shù)
柯里化函數(shù)
函數(shù)–頭等公民
組合和組合和繼承–定義 heighten 和 widen 函數(shù)
使用 Package–將代碼放入包中
隱含的 import
所有類的公共子類–底層類型
進一步 Scala
函數(shù)–局部函數(shù)
引用包中的代碼
組合和繼承–使用 override 修飾符
組合和繼承–實現(xiàn)類 Element 的 above,beside 和 toString()方法
類和對象 (四)
函數(shù)–尾遞歸
沒有“break”和“continue”的日子
組合和繼承–調(diào)用基類構(gòu)造函數(shù)
減低代碼重復(fù)
函數(shù)–函數(shù)–可變參數(shù),命名參數(shù),缺省參數(shù)
起步 Scala
組合和繼承–擴展類
函數(shù)–部分應(yīng)用的函數(shù)
開始神奇的 Scala編程之旅
組合和繼承–概述
Trait 用來實現(xiàn)可疊加的修改操作

函數(shù)–函數(shù)–可變參數(shù),命名參數(shù),缺省參數(shù)

前面我們介紹的函數(shù)的參數(shù)是固定的,本篇介紹 Scala 函數(shù)支持的可變參數(shù)列表,命名參數(shù)和參數(shù)缺省值定義。

重復(fù)參數(shù)

Scala 在定義函數(shù)時允許指定最后一個參數(shù)可以重復(fù)(變長參數(shù)),從而允許函數(shù)調(diào)用者使用變長參數(shù)列表來調(diào)用該函數(shù),Scala 中使用“*”來指明該參數(shù)為重復(fù)參數(shù)。例如:

scala> def echo (args: String *) =
     |   for (arg <- args) println(arg)
echo: (args: String*)Unit
scala> echo()
scala> echo ("One")
One
scala> echo ("Hello","World")
Hello
World

在函數(shù)內(nèi)部,變長參數(shù)的類型,實際為一數(shù)組,比如上例的 String * 類型實際為 Array[String]。 然而,如今你試圖直接傳入一個數(shù)組類型的參數(shù)給這個參數(shù),編譯器會報錯:

scala> val arr= Array("What's","up","doc?")
arr: Array[String] = Array(What's, up, doc?)
scala> echo (arr)
<console>:10: error: type mismatch;
 found   : Array[String]
 required: String
              echo (arr)
                    ^

為了避免這種情況,你可以通過在變量后面添加 _*來解決,這個符號告訴 Scala 編譯器在傳遞參數(shù)時逐個傳入數(shù)組的每個元素,而不是數(shù)組整體。

scala> echo (arr: _*)
What's
up
doc?

命名參數(shù)

通常情況下,調(diào)用函數(shù)時,參數(shù)傳入和函數(shù)定義時參數(shù)列表一一對應(yīng)。

scala> def  speed(distance: Float, time:Float) :Float = distance/time
speed: (distance: Float, time: Float)Float
scala> speed(100,10)
res0: Float = 10.0

使用命名參數(shù)允許你使用任意順序傳入?yún)?shù),比如下面的調(diào)用:

scala> speed( time=10,distance=100)
res1: Float = 10.0
scala> speed(distance=100,time=10)
res2: Float = 10.0

缺省參數(shù)值

Scala 在定義函數(shù)時,允許指定參數(shù)的缺省值,從而允許在調(diào)用函數(shù)時不指明該參數(shù),此時該參數(shù)使用缺省值。缺省參數(shù)通常配合命名參數(shù)使用,例如:

scala> def printTime(out:java.io.PrintStream = Console.out, divisor:Int =1 ) =
     | out.println("time = " + System.currentTimeMillis()/divisor)
printTime: (out: java.io.PrintStream, divisor: Int)Unit
scala> printTime()
time = 1383220409463
scala> printTime(divisor=1000)
time = 1383220422