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

2 回答 2

4

编译器需要知道您是否要立即执行回调。如果没有下划线,则假定立即执行,并将结果分配给 Some。使用下划线,编译器知道它不应该执行回调来获取结果,而是应该将其视为传递给 Some 构造函数(或者更确切地说是 apply() 方法)的参数。

于 2013-07-26T06:18:26.120 回答
3

但为什么会这样呢?

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

def onEvent(callback: Function0): Unit = onEventCallback_=(new Some(callback))
于 2013-07-26T06:22:11.530 回答