(1 +)怎么能成为一个功能?

las*_*773 6 scala

我是Scala的新手,并尝试理解以下代码(源自Beginning Scala一书中的示例)

scala> def w42(f: Int => Int) = f(42)  //(A)
w42: (f: Int => Int)Int

scala> w42 (1 +)      //(B)
res120: Int = 43
Run Code Online (Sandbox Code Playgroud)

我不明白点(B)处的"1 +"如何被视为一个函数(取1个Int参数,并返回一个Int),它满足点(A)的w42定义?

你介意请解释或指出一些有答案的文件吗?

Tom*_*icz 11

简单.在Scala 1 + 2只是一个语法糖1.+(2).这意味着Int有一个名为的方法+接受Int:

final class Int extends AnyVal {
  def +(x: Int): Int = //...
  //...
}
Run Code Online (Sandbox Code Playgroud)

这就是为什么你可以1 +像使用它一样使用它的原因.意外减少方法命名的示例:

scala> def s42(f: String => String) = f("42")
s42: (f: String => String)String

scala> s42("abc".concat)
res0: String = abc42
Run Code Online (Sandbox Code Playgroud)

BTW从技术上讲,eta-expansion也涉及将方法转换为函数.

  • 也许一些有用的提示:`1 +`表示`1 + _`表示`x => 1 + x` (4认同)