【问题标题】:How can I take any function as input for my Scala wrapper method?如何将任何函数作为 Scala 包装器方法的输入?
【发布时间】:2011-02-09 02:51:42
【问题描述】:

假设我想按照以下方式制作一个小包装:

def wrapper(f: (Any) => Any): Any = {
  println("Executing now")
  val res = f
  println("Execution finished")
  res
}

wrapper {
  println("2")
}

这有意义吗?我的包装方法显然是错误的,但我认为我想要做的精神是可能的。我这样想对吗?如果是这样,解决方案是什么?谢谢!

【问题讨论】:

    标签: scala function methods


    【解决方案1】:

    如果您希望 wrapper 方法在其内部执行包装的方法,您应该将参数更改为“按名称”。这使用语法=> ResultType。

    def wrapper(f: => Any): Any = {
      println("Executing now")
      val res = f
      println("Execution finished")
      res
    }
    

    你现在可以这样做了,

    wrapper {
      println("2")
    }
    

    它会打印出来

    Executing now
    2
    Execution finished
    

    如果你希望能够使用被包装函数的返回类型,你可以让你的方法泛型:

    def wrapper[T](f: => T): T = {
      println("Executing now")
      val res: T = f
      println("Execution finished")
      res
    }
    

    【讨论】:

      【解决方案2】:

      在您的情况下,您已经在执行函数 println,然后将结果传递给您的包装器,而它期待一个带有一个参数 (Any) 并返回 Any 的函数。

      不确定这是否是您问题的答案,但您可以使用泛型类型参数并接受不带返回该类型的参数的函数:

      def wrapper[T](f: () => T) = {
        println("Executing now")
        val res = f() // call the function
        println("Execution finished")
        res
      }
      
      wrapper {
        ()=>println("2") // create an anonymous function that will be called
      }
      

      【讨论】:

        猜你喜欢
        • 2020-08-31
        • 2012-11-21
        • 1970-01-01
        • 2014-05-11
        • 1970-01-01
        • 1970-01-01
        • 2011-07-23
        • 2016-12-28
        • 1970-01-01
        相关资源
        最近更新 更多