Scala:返回对函数的引用

mar*_*gio 14 scala

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

Tho*_*mas 30

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

scala> def f(x:Int): Int => Int =  { n:Int => x + n }
f: (x: Int)(Int) => Int
Run Code Online (Sandbox Code Playgroud)

当您调用该函数时,您将获得一个新函数.

scala> f(2)
res1: (Int) => Int = <function1>
Run Code Online (Sandbox Code Playgroud)

这可以称为正常功能:

scala> res1(3)
res2: Int = 5
Run Code Online (Sandbox Code Playgroud)


oll*_*erg 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)
Run Code Online (Sandbox Code Playgroud)

该脚本的输出是:

Safe: 16927.862068965518
Run Code Online (Sandbox Code Playgroud)

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

  • @Rahuλ没有狗屎!这个建议感觉完全不正统,但我是谁来质疑我们伟大领袖的意愿:-) (4认同)