是否有一种方法可以将使用“ val”在Scala中定义的函数,并以整个卷曲支撑块为参数,而不是该块的最终结果



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

def run(func: => Unit) {
   func
}
run {
    print(1)
    println(2)
} // prints 12

但是有没有办法通过匿名功能实现相同的样式?我尝试了以下内容:

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

校正:

()=>Unit不会转化为具有辅助参数的函数,该函数将允许其接受卷曲括号所包含的代码作为参数。所以我的问题的第二部分不正确。

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
val v: (=>Unit) => Unit = w => { println(0); w }
v { println(1); println(2) }

println(0)纯粹插入了,因此您可以看到这确实是一个名称参数:012之前打印。

模式block :=> Type称为by-name参数,不必是函数,但可以是评估Type类型的代码块。这就是第一个示例有效的原因。

第二部分不起作用,因为传递的参数:

println(1); println(2)

评估Unit,与预期类型()=>Unit不匹配。

最新更新