我正在https://github.com/ReactiveX/RxScala/blob/0.x/examples/src/test/scala/examples/RxScalaDemo.scala
学习rxScal示例此示例包含以下代码:
o.subscribe(
n => println(n),
e => e.printStackTrace(),
() => println("done")
)
但是订阅的签名是:
def foreach(onNext: T => Unit, onError: Throwable => Unit): Unit = {
asJavaObservable.subscribe(onNext, onError)
}
我不明白谁将onNext
重命名为n
?
答案 0 :(得分:1)
您已签名foreach
,而不是subscribe
。看起来subscribe
的签名是:
def subscribe(onNext: T => Unit, onError: Throwable => Unit, onComplete: Unit => Unit): Subscription
这意味着
n => println(n)
是在T
的下一个值到达时执行的函数。因此n
具有类型T
并且绑定到传入值。类似地
e => e.printStackTrace()
是一个函数Throwable => Unit
,因此e
的类型为Throwable
,并且会绑定到onError
的{{1}}的错误参数。
答案 1 :(得分:1)
如果我们删除一些Scala魔法可能会更清楚,这样我们就可以更慎重地考虑代码:
def subscribe(onNext: AnyRef => Unit, onError: Throwable => Unit, onComplete: Unit => Unit): Subscription = ...
val myOnNext: AnyRef => Unit = n => println(n)
val myOnError: Throwable => Unit = e => e.printStackTrace()
val myOnComplete: Unit => Unit = _ => println("done")
o.subscribe(myOnNext, myOnError, myOnComplete)
答案 2 :(得分:1)
n => println(n)
是一个匿名函数(一个没有名字的函数),它接受一个参数并对其进行操作。该论点标记为n
,但可能是x
或wwz
,或其他任何内容。
当您将该函数作为参数传递给另一个函数时,接收函数将为接收到的参数赋予名称。 foreach
的第一个参数标记为onNext
,但可能是x
或zzw
或其他任何内容。它是收到的函数的名称。传递给foreach
时该函数的名称无关紧要,也许它是匿名的,没有名称,在foreach
代码中它现在的名称为onNext
在foreach
内,onNext
是一个接受参数并对其起作用的函数的名称。该参数的名称对于foreach
代码来说是未知且无关紧要的。
因此,简而言之,onNext
尚未重命名为n
。它们基本上是无关的。