为什么这不执行为RxScala的doOnSubscribe功能提供的功能?

时间:2016-03-29 03:08:17

标签: rx-scala

  val x: Observable[Int] = Observable.just(1).doOnSubscribe(() => println(s"subscribed"))
  val y = x.subscribe(t => println(s"got item: $t"))
  println("all done")

我原以为这段代码会打印

subscribed
got item: 1
all done

但它没有打印最初的订阅"。

1 个答案:

答案 0 :(得分:1)

doOnSubscribe的签名是:

def doOnSubscribe(onSubscribe: => Unit): Observable[T] 

也就是说,它需要一个按名称参数。所以你必须按如下方式使用它:

Observable.just(1).doOnSubscribe(println(s"subscribed"))

按名称表示println传递给doOnSubscribe时不会被执行,但只有doOnSubscribe使用它才会执行。

您传递给doOnSubscribe的是0-arity函数,即类型为() => Unit的表达式,并且通过丢弃表达式的值,Scala可以将任何表达式转换为Unit,以便& #39;为什么编译。

这是恕我直言,我更喜欢() => Unit参数而不是=> Unit,然后它会按预期工作。

顺便说一句:你not the first对此感到困惑; - )