scala - 将函数传递给没有括号参数的构造函数
问题描述
我可以在 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 }
解决方案
简单的答案是您可以省略{}
而不是省略()
,如下所示:
object MyObj extends C( (i: Int, j: Int) => i + j )
更长的答案是编写能力foo{x}
而不是foo(x)
特定于函数应用程序并且不适用于构造函数。详细信息在这里,但基本上您可以在{}
应用带有单个参数的函数时使用表达式。
推荐阅读
- visual-studio-code - VS Code Jupyter Notebook 看起来与发行说明不同
- java - SqlExceptionHelper:错误:语法错误(近似位置:“用户”)
- laravel - Laravel:在字符串上调用带有()的成员函数
- azure-webjobs - 关于 azure web job singleton lock 的意外行为的问题
- c++ - 无法弄清楚我的 UVA 10029 代码的问题
- bash - 如何使用文件的每一行作为 for 循环的参数
- python - 使用 Numba Cuda.jit 在 GPU 上的 Python 中进行 Monte Carlo Pi 估计
- ruby-on-rails - 如何在 Rails 中执行原子增量
- docker - Docker Linux 容器中的 SSL 证书问题
- reactjs - Firestore 跨源请求被阻止