有没有一种方法可以调用在Scala中使用`val`定义的函数,并且将整个花括号块作为参数而不是该块的最终结果?

bla*_*man 4 scala function user-defined-functions

我知道,如果我们想将大括号中的代码块作为使用定义的函数的参数传递def,我们可以编写:

def run(func: => Unit) {
   func
}
run {
    print(1)
    println(2)
} // prints 12
Run Code Online (Sandbox Code Playgroud)

但是,有没有一种方法可以使用匿名函数实现相同的样式?我尝试了以下方法:

val v: (()=>Unit) => Unit = ( w: ()=> Unit) => { w() }
v( () => { println(1); println(2) } ) // Works as expected. Prints 12
v { println(1); println(2) } // error: type mismatch
Run Code Online (Sandbox Code Playgroud)

更正:

()=>Unit不会转换为具有by-name参数的函数,该函数将允许其接受大括号括起来的代码作为参数。所以我的问题的第二部分是不正确的。

如果不重新指定函数文字中的参数类型,那么Alexey Romanov的答案将非常有效,但是如果我们重新指定函数文字中与变量类型完全匹配的参数类型,则将其视为错误。例如,如果我们写

val v: (=>Unit) => Unit = (w) => { println(0); w } // works
val v: (=>Unit) => Unit = (w:=>Unit) => { println(0); w } // error

val v: (Int => Int) = (w) => 43   // works
val v: (Int => Int) = (w:Int) => 43  // works as well
Run Code Online (Sandbox Code Playgroud)

Ale*_*nov 6

val v: (=>Unit) => Unit = w => { println(0); w }

v { println(1); println(2) }
Run Code Online (Sandbox Code Playgroud)

println(0)纯粹是插入的,因此您可以看到这实际上是一个by-name参数:01和之前打印2