【问题标题】:Scala Passing Function with ArgumentScala 带参数的传递函数
【发布时间】:2015-02-10 13:24:26
【问题描述】:

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

我怎样才能使上面的代码工作?

编辑:我在每秒一次中添加了一个 x 以阐明目标是传递整数。

【问题讨论】:

  • 真的需要将 Int 传递给 oncePerSecond 吗?下面的所有答案都应该没问题,并且比通过该 Int 更好。无论如何,oncePerSecond(timeFlies, 5)def oncePerSecond(callback: Int => Unit, x: Int) 应该可以工作。

标签: scala functional-programming


【解决方案1】:

至少有两种方法可以做到这一点,具体取决于您想要传递参数的确切位置。第一种方法是您保留 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,但timeFlies(5) 具有签名=> Unit,因为partial application。这基本上意味着您可以应用参数来自动创建采用较少参数的函数。 oncePerSecond 需要在其签名中知道您是否已经将 Int 参数应用于回调。

这两种方法都适用于不同的用例。第一种方式让oncePerSecond 不必知道回调的参数。第二种方法让您可以根据需要在每次循环中更改x 的值。

【讨论】:

  • 模型答案。谢谢。
  • 第一种方式'callback:=> Unit'是否有保留我要传递的函数的'类型'? callback: => Unit 太笼统了,我想确切地说我期待哪种类型的功能......
  • 不。如果您不想知道未应用的类型,则使用该方法的全部意义。
【解决方案2】:

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

oncePerSecond(() => timeFlies(5))

【讨论】:

    【解决方案3】:

    oncePerSecond(() => timeFlies(5))

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

    【讨论】:

      【解决方案4】:

      参数callback: () => Unit是一个零参数函数,返回Unit。您应该将其设为按名称调用参数(计算结果为Unit):

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

      【讨论】:

        【解决方案5】:

        将函数作为参数传递

        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(_)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-01-13
          • 1970-01-01
          • 2010-11-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多