详解scala中函数默认参数和命名参数
默认参数部分
我们前端都是写道函数默认参数的一些问题,这里我们再拿出来说一下。 基本上官方的分文档还是写的比较的详细。在看一些基础的时候可以学习下。 Scala具备给参数提供默认值的能力,这样调用者就可以忽略这些具有默认值的参数。
def log( message: String , level: String = "INFO" ) = println( s"$level: $message" )
log( "System starting" )
log( "User not found" , "WARNING" )
上面的参数level有默认值,所以是可选的。最后一行中传入的参数"WARNING"重写了默认值"INFO" 在Java中,我们可以通过带有可选参数的重载方法达到同样的效果。不过,只要调用方忽略了一个参数,其他参数就必须要带名传入。
object ScalaTest {
def main( args: Array[ String ] ) : Unit = {
class Point( val x: Double = 0 , val y: Double = 0 )
val point1 = new Point( y = 1 )
println( point1. x+ " " + point1. y)
}
}
这里必须带名传入y = 1。 注意从Java代码中调用时,Scala中的默认参数则是必填的(非可选),如
class Point( val x: Double = 0 , val y: Double = 0 )
public class Main {
public static void main( String [ ] args) {
Point point = new Point( 1 ) ;
}
}
命名参数部分
其实这部分还是比较间的,主要还是函数的参数传递规则。 当调用方法时,实际参数可以通过其对应的形式参数的名称来标记
def printName( first: String , last: String ) : Unit = {
println( first + " " + last)
}
printName( "John" , "Smith" )
printName( first = "John" , last = "Smith" )
printName( last = "Smith" , first = "John" )
注意使用命名参数时,顺序是可以重新排列的。 但是,如果某些参数被命名了,而其他参数没有,则未命名的参数要按照其方法签名中的参数顺序放在前面。
printName( last = "Smith" , "john" )
printName( "john" , last = "Smith" , )
对比Java,注意调用 Java 方法时不能使用命名参数。