转换`=> Unit`到`()=> Unit`(Convert `=> Unit` to

2019-10-18 10:37发布

这是什么块的类型: 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) 但是,为什么这项工作?

Answer 1:

编译器需要知道你是否要回调立即或不执行。 没有下划线假设立即执行,结果被分配到一些。 以下划线,编译器知道,它不应该执行回调得到的结果,但应该把它作为参数传递给某些构造(或者更确切地说,apply()方法)。



Answer 2:

但是,为什么这项工作?

有时你能想到的by-name参数为没有参数的函数。 其实这是一个Function0erasure在编译阶段。 你可以编译你的代码-Xprint:erasure看到这样的:

def onEvent(callback: Function0): Unit = onEventCallback_=(new Some(callback))


文章来源: Convert `=> Unit` to `() => Unit`
标签: scala lambda