Scala:为什么要重命名参数?

时间:2016-04-20 18:05:44

标签: scala

我正在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

3 个答案:

答案 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,但可能是xwwz,或其他任何内容。

当您将该函数作为参数传递给另一个函数时,接收函数将为接收到的参数赋予名称。 foreach的第一个参数标记为onNext,但可能是xzzw或其他任何内容。它是收到的函数的名称。传递给foreach时该函数的名称无关紧要,也许它是匿名的,没有名称,在foreach代码中它现在的名称为onNext

foreach内,onNext是一个接受参数并对其起作用的函数的名称。该参数的名称对于foreach代码来说是未知且无关紧要的。

因此,简而言之,onNext尚未重命名为n。它们基本上是无关的。

相关问题