我知道,如果我们想将卷曲括号中的代码作为参数传递给使用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)
纯粹插入了,因此您可以看到这确实是一个名称参数:0
在1
和2
之前打印。
模式block :=> Type
称为by-name
参数,不必是函数,但可以是评估Type
类型的代码块。这就是第一个示例有效的原因。
第二部分不起作用,因为传递的参数:
println(1); println(2)
评估Unit
,与预期类型()=>Unit
不匹配。