分配函数时保留命名参数和默认参数

Keeping named and default parameters when assigning a function

使用未应用的方法分配函数时,命名参数和默认参数似乎丢失了。有什么办法可以避免这种情况吗?

def foo(namedParam: String = "defaultValue") = namedParam*2
// scala> foo()
// res8: String = defaultValuedefaultValue

def bar = foo _
// scala> bar()
// <console>:28: error: not enough arguments for method 
//               apply: (v1: String)String in trait Function1. 
//               Unspecified value parameter v1.

我想这样做的原因是将我的导入捆绑在一个文件中,即

myproject/imports.scala

object imports {
  def externalAPIFunction = myproject.somepackage.internalFunction _
}

scala shell

import myproject.imports._

externalAPIFunction() // no named or default arguments :(

有什么方法可以做到这一点,还是我必须将我的默认参数放在外部函数定义中?

我认为您需要使用柯里化。

def foo()(namedParam: String = "defaultValue") = namedParam * 2
                                                  //> foo: ()(namedParam: String)String
  // scala> foo()
  // res8: String = defaultValuedefaultValue

  def bar() = foo() _                             //> bar: ()String => String
  bar()                                           //> res0: String => String = <function1>

函数(即 Function<N>[...] 类型的值)在 Scala 中不能有默认或隐式参数,只有方法可以。 method _ returns 一个函数:这就是它的用途。所以是的,为了达到你的目的,你需要写

object imports {
  def externalAPIFunction(namedParam: String = "defaultValue") = 
    myproject.somepackage.internalFunction(namedParam)
}

您可以使用

避免重复
object imports {
  val x = myproject.somepackage
}

// elsewhere
import myproject.imports._

x.internalAPIFunction()

// or
import myproject.imports.x._

internalAPIFunction()

对于您的目的来说,这可能足够好,也可能不够好。