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)
val v: (=>Unit) => Unit = w => { println(0); w }
v { println(1); println(2) }
Run Code Online (Sandbox Code Playgroud)
println(0)纯粹是插入的,因此您可以看到这实际上是一个by-name参数:0在1和之前打印2。