2013-07-26 51 views
1

这个块的类型是什么:callback: => Unit将`=>单元转换为`()=>单元`

我如何将它分配给Option?换句话说,如何更新下面的代码,使其没有任何编译错误?

var onEventCallback: Option[() => Unit] = None 

    def onEvent(callback: => Unit) { 
    onEventCallback = Some(callback) // HERE compilation error: Some[Unit] doesn't conform to Option[() => Unit] 
    } 

好的。我用Some(callback _)而不是Some(callback)来解决它。但为什么这项工作?

回答

4

编译器需要知道您是否希望立即执行回调。无需假设下划线立即执行,并将结果分配给Some。通过下划线,编译器知道它不应该执行回调来获取结果,而应该将其作为传递给Some构造函数(或者说apply()方法)的参数。

3

但为什么这项工作?

有时你可以将by-name参数看作一个没有参数的函数。实际上,编译器中的erasure阶段后是Function0。你可以用-Xprint:erasure来编译你的代码,看看这个:

def onEvent(callback: Function0): Unit = onEventCallback_=(new Some(callback)) 
相关问题