【问题标题】:Scala: wrapper function that returns a generic typeScala:返回泛型类型的包装函数
【发布时间】:2018-02-23 19:27:04
【问题描述】:

我正在尝试创建一个通用包装函数,该函数可以包装任何返回对象的方法。与this SO 问题中的答案非常相似。我尝试了以下方法:

def wrapper_function[T](f: => T): T = { 
    println("Executing now");
    val ret: T = f;
    println("Execution finished"); 
    ret 
}

def multiply2( x: Int ): Int = wrapper_function {
    println("inside multiply2"); 
    return x*2
}

但是,我观察到在包装函数内部的函数调用之后没有执行任何操作。具体来说,“执行完成”没有被打印出来。

scala> val x = multiply2(4)
Executing now
inside multiply2
x: Int = 8

我正在使用 scala 2.11.8

我在这里做错了吗?这令人费解,我将不胜感激。

【问题讨论】:

  • multiply2中,return不是从传递给wrapper_function的块返回,而是从multiply2作为一个整体返回。将 return x*2 替换为 x*2
  • 一篇关于return的精彩博文:tpolecat.github.io/2014/05/09/return.html

标签: scala higher-order-functions


【解决方案1】:

Assaf Mendelson 的回答在大多数情况下都是正确的。但是,如果您不拥有要包装的内部函数的代码,或者在内部函数中使用return 的合法案例,它不起作用(请参阅here)

对于这些情况,它将通过在 try-finally 块中执行内部函数来工作:

def wrapper_function[T](f: => T): T = { 
   println("Executing now");
   val ret: T = try f finally {
      println("Execution finished"); 
   }
   ret 
}

【讨论】:

    【解决方案2】:

    我相信你的问题是“return”语句。

    scala 中的返回与 java 中的返回不同。你可以看看in this answer,但基本上它是一种“堆栈展开”,会导致你从包装函数返回。

    考虑一下,当您执行 f: => T 时,您实际上是在获取块并运行它。这个块有一个 return ,它只是从包装器中中断并返回值(而不是不使用 return 在这种情况下,它的结果将用于赋值)。

    一般来说,如果你在函数或块的末尾使用 scala 中的 return,你几乎总是做错事......

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 1970-01-01
      • 2016-08-15
      • 2023-03-31
      • 1970-01-01
      • 2019-04-10
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多