我听说Scala包含一个名为命名和默认参数的功能,但我不知道这些参数是做什么或如何使用它们。
有人可以解释一下他们的用法吗?
答案 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。