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



我可以在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)的能力特定于函数应用程序,不适用于构造函数。详细信息在这里,但基本上您可以在应用接受单个参数的函数时使用{}表达式。

相关内容

最新更新