Scala:返回对函数的引用

时间:2010-07-29 14:20:48

标签: scala

我想要一个Scala函数返回对另一个函数的引用,这可能吗?

2 个答案:

答案 0 :(得分:30)

您可以返回一个函数类型(由A => B定义)。在这种情况下Int到Int:

scala> def f(x:Int): Int => Int =  { n:Int => x + n }
f: (x: Int)(Int) => Int

当您调用该功能时,您将获得一项新功能。

scala> f(2)
res1: (Int) => Int = <function1>

可以称之为正常功能:

scala> res1(3)
res2: Int = 5

答案 1 :(得分:7)

您可以使用更高阶函数的一种方法(对于功能对象而言有点独特)是在对象之间创建松散耦合。

在下面的示例中,类Alarm有一个方法check4Danger(),用于检查计算值是否超过DangerLevel。 Alarm类对调用它的对象一无所知。

Car类有一个方法engineCrashRisk(),它返回一个匿名函数,用于计算引擎崩溃的风险。 Car与警报无关。

case class Alarm(temperature: Double, pressure: Double){
  val DangerLevel = 100000.0
  def check4Danger( f: (Double, Double) => Double): Boolean = {
    val risk = f(temperature, pressure)
    if( risk > DangerLevel ){
      println("DANGER: "+ risk )
      true
    }else{
      println("Safe: " + risk)
      false
    }
  }
}

case class Car(fuelRate: Double, milage: Int){
  def engineCrashRisk() =
    (temperature: Double, pressure: Double) =>
      temperature * milage + 2*pressure / fuelRate
}


val car = Car(0.29, 123)
val riskFunc = car.engineCrashRisk

val alarm = Alarm(124, 243)
val risk = alarm.check4Danger(riskFunc)

此脚本的输出为:

Safe: 16927.862068965518

在此示例中,我们使用带闭包的匿名函数在AlarmCar对象之间创建无依赖关系的方法调用。这个例子有意义吗?