2013-05-06 118 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