将函数传递给不带括号参数的构造函数

Passing a function to a constructor without bracket arguments

我可以在 scala 中编写以下内容

def foo[P1, P2, R](f: (P1, P2) => R) = {}

val x = foo { (i: Int, j: Int) => i + j }

但是假设我想在构造函数中做类似的事情:

class C[P1, P2, R](f: (P1, P2) => R) {
  def apply(p1: P1, p2: P2): R = f(p1, p2)
}

然后要定义一个 C 类型的对象,我需要执行以下操作才能编译它:

object MyObj extends C( { (i: Int, j: Int) => i + j })

为什么我需要括号,有什么方法可以避免使用它们并这样定义我的对象:

object MyObj extends C { (i: Int, j: Int) => i + j }

简单的答案是您可以省略 {} 而不是省略 (),如下所示:

object MyObj extends C( (i: Int, j: Int) => i + j )

较长的答案是,编写 foo{x} 而不是 foo(x) 的能力特定于函数应用程序,不适用于构造函数。详细信息是 here 但基本上您可以在 {} 中使用表达式来应用采用单个参数的函数。