我想要一个Scala函数返回对另一个函数的引用,这可能吗?
答案 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
在此示例中,我们使用带闭包的匿名函数在Alarm
和Car
对象之间创建无依赖关系的方法调用。这个例子有意义吗?