2013-05-06 86 views

回答

5

一些特殊功能,呼叫類型Scala中

命名參數:

命名參數允許您將參數傳遞給函數在不同order.For例如:

def speed(distance: Float, time: Float): Float = distance/time 

而且它可以像這樣使用:

speed(distance = 100, time = 10) 

speed(time = 10, distance = 100) 

默認參數:

斯卡拉讓您爲函數參數指定默認值。例如:

def printTime(out: java.io.PrintStream = Console.out) = 
    out.println("time = "+ System.currentTimeMillis()) 

然後就可以調用printTime而無須給予任何輸出流是這樣的:

printTime() 

反覆論證:

斯卡拉允許您指出的最後一個參數一個功能可能會重複。例如:

def echo(args: String*) = 
    for (arg <- args) 
    println(arg) 

然後你可以使用它像這樣:

echo() 
echo("one") 
echo("hello", "world!") 
1

默認參數解決了其他編程語言通常用方法重載解決的問題。當有一個方法

def addNumbers(a: Int, b: Int, c: Int, d: Int) = a+b+c+d 

使用多個參數它可以在重載的方法來設置一些默認值提供了一個API,更容易使用,如果一個人不希望填補所有參數有用:

def addNumbers(a: Int, b: Int, c: Int) = addNumbers(a, b, c, 0) 
def addNumbers(a: Int, b: Int) = addNumbers(a, b, 0, 0) 

在默認參數它不再需要重載這樣的方法:

def addNumbers(a: Int, b: Int, c: Int = 0, d: Int = 0) = a+b+c+d 

編譯器自動調用與特定默認爲arg的方法如果他們沒有指定uments:

scala> addNumbers(1, 2, 3) 
res2: Int = 6 

的默認參數一個有用的地方是在構造函數中。這是比較容易寫

class A(i: Int, s: String = "") 

class A(i: Int, s: String) { 
    def this(i: Int) = this(i, "") 
} 

在另一邊命名的參數可以改善方法調用的可讀性:

def compute(xs: List[Int], executeInParallel: Boolean) = ??? 

compute(xs, executeInParallel = true)更容易閱讀僅比compute(xs, true)

可以隨時指定參數的名稱,而不管其順序如何。這意味着compute(executeInParallel = true, xs = xs)compute(xs, true)相同。編譯器通常只需要一個提示,當參數的排序改變時,哪個參數必須放置在哪個位置。


一個用例,其中兩個命名和默認參數可以在case類,其是由編譯器自動生成的複製方法中使用在於:

scala> case class Person(name: String, age: Int) 
defined class Person 

scala> val p = Person("Ruben", 43) 
p: Person = Person(Ruben,43) 

scala> val oneYearOlder = p.copy(age = p.age+1) 
oneYearOlder: Person = Person(Ruben,44) 

這可能是重要的提到命名參數只適用於在Scala中定義的方法。在Java中定義的方法參數不能通過名稱來調用。

而且命名參數不要在函數文本工作:

scala> val f = (i: Int) => i 
f: Int => Int = <function1> 

scala> f(i = 1) 
<console>:9: error: not found: value i 
       f(i = 1) 
       ^

欲瞭解更多信息,這個功能可以去看一下docs.scala-lang.org