在Scala中部分应用curried构造函数

Hen*_*son 6 scala currying

考虑以下:

class A(foo: Int)(bar: Int)(baz: Int)
object A{
    def apply(foo: Int)(bar: Int)(baz: Int) = new A(foo)(bar)(baz)
}
Run Code Online (Sandbox Code Playgroud)

使用apply方法,我可以执行以下操作:

scala> A(1)(2)(3)
res12: Script.A = Script$A@7a6229e9

scala> A(1)_
res13: Int => (Int => Script.A) = <function1>
Run Code Online (Sandbox Code Playgroud)

为什么我不能做以下事情:

scala> new A(1)_
<console>:21: error: missing arguments for constructor A in class A
              new A(1)_
              ^
Run Code Online (Sandbox Code Playgroud)

我错过了语法明智吗?我认为构造函数只是类中的方法,所以它们应该在需要时被提升到函数(很像上面的apply方法)

4le*_*x1v 4

调用new该类应该创建该类的实例(在您的例子中为 A),但您想要做的new A(1) _是在没有承包商完整数据的情况下创建 A 类的实例,这本质上根本不合逻辑。但编写A(1) _是正确且符合逻辑的,因为在这种情况下,您将一个方法提升为一个函数(apply来自伴随对象的方法),该函数已经拥有创建该类的实例的所有数据。

  • 请注意,您(几乎)可以编写“new A(1)(_)(_)”,因为这样您就可以完全指定构造函数的参数。不幸的是,正如所写,编译器无法处理它,您需要识别类型,例如“new A(1)(_: Int)(_: Int)”。 (4认同)