Scala : Functions and Parameters
一个Function 是一个实例
在scala中,function是类的实例,所以在一个function上进行和类的实例一样的操作,下面创建了一个function并将它赋值给一个变量:
scala> val f:Int => String = x => "Dude: "+x f: (Int) => String = <function1>
实际上它相当于:
scala> val f:(Int => String) = { x=> "Dude :" +x }
f: (Int) => String = <function1>
可以在 f上调用方法:
scala> f.toString res0: java.lang.String = <function1> scala> f == f res1: Boolean = true scala> f == 4 res2: Boolean = false
用一个参数来apply function:
scala> f(44) res3: String = Dude: 44
functions 作为参数传递
function能像任何其它参数那样被传递给方法。下面定义一个w42 方法,它接收一个输入为Int返回为String的function,在这里w42方法apply 42给函数,并返回結果。
scala> def w42(f: Int => String) = f(42) w42: (f: (Int) => String)String
用函数变量来调用它:
scala> w42(f) res11: String = Dude: 42
下面再定义一个fm方法,接收一个Int参数并返回一个String,可以看到几种不同的方式将这个方法作为一个函数传递给 w42方法:
scala> def fm(i: Int) = "fm "+i fm: (i: Int)java.lang.String
可以通过声明i及它的类型Int创建一个函数来传递给w42 方法:
scala> w42((i: Int) => fm(i)) res12: String = fm 42
可以看到Scala的类型解析器可以知道我们传递的是 Int => String,所以没有必要声明i的类型:
scala> w42(i => fm(i)) res13: String = fm 42
进一步地,通过传递fm且进行partially applying:即为函数或方法提供部份但不是全部的参数。
scala> w42(fm _) res14: String = fm 42
又或者,我们可以像传递变量一样只传递fm:
scala> w42(fm) res15: String = fm 42
虽然上面几种方式写法不同,但是传递的是同一个function,事实上,这相当于在Java中传递一个隐藏内部类:
scala> scala> w42(new Function1[Int, String] {
def apply(i: Int) = fm(i)
})
Replaying 1 commands from interpreter transcript.
res17: String = fm 42
在这种情况下,你可以传递多行的代码,下面的代码创建了一个range,然后将range用Seq的mkString方法转化成一个逗号分隔的String:
scala> w42 {
| i =>
| val range = 1 to i
| range.mkString(",")
| }
res18: String = 1,2,3,4 ... 41,42
Related posts:
评论