为什么这不执行为 RxScala 的 doOnSubscribe 函数提供的函数?
Why doesn't this execute the function given for RxScala's doOnSubscribe function?
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
但它不打印初始 "subscribed"。
doOnSubscribe
的签名是:
def doOnSubscribe(onSubscribe: => Unit): Observable[T]
也就是说,它需要一个 by-name 参数。所以你必须按如下方式使用它:
Observable.just(1).doOnSubscribe(println(s"subscribed"))
by-name 表示 println
传递给 doOnSubscribe
时不会执行,但只有一次 doOnSubscribe
使用它。
您传递给 doOnSubscribe
的是一个 0 元函数,即类型 () => Unit
的表达式,通过丢弃表达式的值,Scala 可以将任何表达式转换为 Unit,所以这就是它编译的原因。
恕我直言,这是令人困惑的,我更喜欢 () => Unit
参数而不是 => Unit
,然后它会按您预期的那样工作。
顺便说一句:您 not the first 对此感到困惑 ;-)
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
但它不打印初始 "subscribed"。
doOnSubscribe
的签名是:
def doOnSubscribe(onSubscribe: => Unit): Observable[T]
也就是说,它需要一个 by-name 参数。所以你必须按如下方式使用它:
Observable.just(1).doOnSubscribe(println(s"subscribed"))
by-name 表示 println
传递给 doOnSubscribe
时不会执行,但只有一次 doOnSubscribe
使用它。
您传递给 doOnSubscribe
的是一个 0 元函数,即类型 () => Unit
的表达式,通过丢弃表达式的值,Scala 可以将任何表达式转换为 Unit,所以这就是它编译的原因。
恕我直言,这是令人困惑的,我更喜欢 () => Unit
参数而不是 => Unit
,然后它会按您预期的那样工作。
顺便说一句:您 not the first 对此感到困惑 ;-)