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

Scala:为什么要重命名参数?,scala,Scala,我正在学习rxScal示例 此示例包含以下代码: o.subscribe( n => println(n), e => e.printStackTrace(), () => println("done") ) 但subscribe的签名为: def foreach(onNext: T => Unit, onError: Throwable => Unit): Unit = { asJavaObservabl

我正在学习rxScal示例

此示例包含以下代码:

  o.subscribe(
      n => println(n),
      e => e.printStackTrace(),
      () => println("done")
    )
但subscribe的签名为:

 def foreach(onNext: T => Unit, onError: Throwable => Unit): Unit = {
    asJavaObservable.subscribe(onNext, onError)
  }

我不明白是谁将
onNext
重命名为
n

您已经给了
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=>单元
,因此
e
具有类型
Throwable
,并且将绑定到
可观察的
onError
的错误参数

,如果我们移除一些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)
n=>println(n)
是一个匿名函数(一个没有名字的函数),它接受一个参数并对其进行操作。该参数的标签为
n
,但它可能是
x
wwz
或其他任何形式

当您将该函数作为参数传递给另一个函数时,接收函数将为接收到的参数指定一个名称。
foreach
的第一个参数标记为
onNext
,但它可能是
x
zzw
或其他任何形式。它是所接收函数的名称。当该函数被传递到
foreach
时,它的名称并不重要,可能它是匿名的,没有名字,在
foreach
代码中,它现在的名称是
onNext

foreach
中,
onNext
是接受参数并对其执行操作的函数的名称。该参数的名称对于
foreach
代码来说是未知的和无关紧要的


因此,简而言之,
onNext
没有被重命名为
n
。它们本质上是不相关的。

谢谢您的解释。我认为这是一个命名参数,函数就是“println”。我监督“n”。正确的语法是“onName=println(33;)”。