使用未应用的方法分配函数时,似乎丢失了命名参数和默认参数。有什么方法可以避免这种情况吗?
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 :(
任何方法都可以这样做,还是必须将我的默认参数放在外部函数定义中?
答案 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>