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

时间:2016-10-12 18:13:01

标签: scala named-parameters default-parameters

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

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 :(

任何方法都可以这样做,还是必须将我的默认参数放在外部函数定义中?

2 个答案:

答案 0 :(得分:1)

函数(即类型Function<N>[...]的值)在Scala中只能有默认或隐式参数,只有方法可以。并且method _会返回一个函数:它的含义是什么。所以,是的,为了达到你的目的,你需要写

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()

可能或可能不足以满足您的目的。

答案 1 :(得分:-1)

我认为你需要使用currying。

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>