Scala传递函数与参数

时间:2014-12-11 22:12:11

标签: scala functional-programming

将函数传递给另一个函数的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))
  }
}

如何使上述代码有效?

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

5 个答案:

答案 0 :(得分:22)

至少有两种方法可以做到这一点,具体取决于你想要传递参数的确切位置。第一种方法是保持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))
  }
}

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

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)
  }
}

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

这两种方法对不同的用例都很有用。第一种方法让oncePerSecond不必知道回调的参数。第二种方法允许您在每次循环时更改x的值。

答案 1 :(得分:3)

timeFlies的返回类型为Unit,而不是Function。也许你的意思是:

oncePerSecond(() => timeFlies(5))

答案 2 :(得分:2)

oncePerSecond(() => timeFlies(5))

def oncePerSecond(callback: => Unit) {...

答案 3 :(得分:0)

参数callback: () => Unit是一个返回Unit的零参数函数。你应该使它成为call-by-name参数(评估为Unit的东西):

def oncePerSecond(callback: => Unit) = ...

答案 4 :(得分:0)

将函数作为参数传递

def function1(callback: Int => Unit): Unit = {
  // do something
}

def callback_function(x: Int): Unit = {
   // do something
}

function1(callback_function)

如果要将函数的引用传递给变量,可以执行以下操作...

假设我们有函数..

def handleLogic(x: Int): Unit => {
   // do something
}

val method = handleLogic _

val method = handleLogic(_)