Home > Scala > Scala : Functions and Parameters

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:

  1. Scala : Partial Functions 和 Type Parameters
  2. Scala : 作用域中的变量,容器
  3. Scala 集合框架:Tuple,Map[K,V],Option[T]
  4. Scala 集合框架:List
  5. Scala : 交互式应用程序,函数组合
Categories: Scala Tags:
  1. No comments yet.
  1. No trackbacks yet.