首页 > 解决方案 > 将函数传递给没有括号参数的构造函数

问题描述

我可以在 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)
}

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

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

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

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

标签: scalacurly-braces

解决方案


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

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

更长的答案是编写能力foo{x}而不是foo(x)特定于函数应用程序并且不适用于构造函数。详细信息在这里,但基本上您可以在{}应用带有单个参数的函数时使用表达式。


推荐阅读