Scala传递函数与参数

BAR*_*BAR 17 functional-programming scala

将函数传递给另一个函数的Scala示例缺少传递函数(timeFlies)采用参数(x)的情况.

object Timer {
  def oncePerSecond(callback: (Int) => Unit) {
    while (true) { callback(x); Thread sleep 1000 }
  }
  def timeFlies(x: int) {
    println("time flies like an arrow...")
  }
  def main(args: Array[String]) {
    oncePerSecond(timeFlies(5))
  }
}
Run Code Online (Sandbox Code Playgroud)

如何使上述代码有效?

编辑:我在Oncepersecond中添加了一个x来澄清目标是传递整数.

Kar*_*ldt 23

至少有两种方法可以做到这一点,具体取决于你想要传递参数的确切位置.第一种方式就是你保持main原样.

object Timer {
  def oncePerSecond(callback: => Unit) {
    while (true) { callback; Thread sleep 1000 }
  }
  def timeFlies(x: Int) {
    println("time flies like an arrow...")
  }
  def main(args: Array[String]) {
    oncePerSecond(timeFlies(5))
  }
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是在回调点传递参数,如下所示:

object Timer {
  def oncePerSecond(callback: (Int) => Unit) {
    val x = 5
    while (true) { callback(x); Thread sleep 1000 }
  }
  def timeFlies(x: Int) {
    println("time flies like an arrow...")
  }
  def main(args: Array[String]) {
    oncePerSecond(timeFlies)
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,由于部分应用,它timeFlies具有签名(Int) => Unit,但timeFlies(5)具有签名.这基本上意味着您可以应用参数来自动创建一个占用较少参数的函数. 如果您已经将参数应用于回调,则需要知道其签名. => UnitoncePerSecondInt

这两种方法对于不同的用例都很有用.第一种方法让我们oncePerSecond不必知道回调的参数.第二种方法允许您根据需要更改x循环中每次的值.