我是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也涉及将方法转换为函数.