什么是命名和默认参数?

时间:2013-05-06 02:01:18

标签: scala

我听说Scala包含一个名为命名和默认参数的功能,但我不知道这些参数是做什么或如何使用它们。

有人可以解释一下他们的用法吗?

2 个答案:

答案 0 :(得分:5)

Scala中的一些特殊函数调用类型

命名参数:

命名参数允许您以不同的顺序将参数传递给函数。例如:

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

它可以像这样使用:

speed(distance = 100, time = 10)

speed(time = 10, distance = 100)

默认参数:

Scala允许您指定函数参数的默认值。例如:

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

然后你可以调用printTime而不提供任何像这样的输出流:

printTime()

重复参数:

Scala允许您指示函数的最后一个参数可能重复。例如:

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

然后你可以像这样使用它:

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

答案 1 :(得分: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

如果未指定,则编译器会自动使用特定的默认参数调用该方法:

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)相同。编译器通常只需要一个提示,当参数的排序发生变化时,必须将哪个参数放在哪个位置。


可以使用命名和默认参数的用例位于案例类的复制方法中,它由编译器自动生成:

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