请考虑以下代码:
object HelloIntelliScala {
def main(args : Array[String]) = {
println(callAnyFunc(funcWithNoArgs))
val l = callAnyFuncWithArgs("bingo") (funcWithArgs)
println(l)
val l2 = callAnyFuncWithArgs(21) (funcWithArgs2)
println(l2)
}
type noArgCallBack = () => Any
def funcWithArgs(inp : String) : Any = {
println("Func with arg called, arg value is: " + inp)
"Hello " + inp + "!"
}
def funcWithArgs2(inp : Int) : Any = {
println("Func with arg called, arg value is: " + inp)
"Hello, integer " + inp + "!"
}
//how do i call this function?
def funcWithArgs3(inp : Int, name : String) : Any = {
println("Func with 2 args called, arg values are: " + (inp, name))
"Hello, multiple args " + (inp, name) + "!"
}
def funcWithNoArgs() : Any = {
println("Function with no args was called!")
"Hello NO_ARGS"
}
def callAnyFunc(callback : noArgCallBack) : Any = {
callback();
}
def callAnyFuncWithArgs[A, B](arg : A)(f : A => B) : Any = {
f(arg); //how do I pass variable args here
}
}
我需要一种通用的方法来调用任何带参数的函数,就像没有参数的函数一样。请注意,要传入的参数列表可以是变量的,我们在编译时不知道参数类型。此外,我确实需要Any返回类型,因为我需要使用此值进行后期处理。有没有办法做到这一点?
答案 0 :(得分:3)
Scala不会抽象方法arity。或者,换句话说,如果没有为每个arity编写样板文件,就没有办法做到这一点。
幸运的是,Miles Sabin用Shapeless写了所有样板文件。
答案 1 :(得分:2)
我想你想要这样的东西:
def funcWithArgs(args: String*) = args foreach println
def callAnyFuncWithArgs[A, B]
(args: A*)(f: (A*) => B) = f(args: _*)
然后调用funcWithArgs作为部分应用的函数:
callAnyFuncWithArgs("bingo")(funcWithArgs _)
答案 2 :(得分:1)
这可能适用于函数currying ... 看看这里:http://www.codecommit.com/blog/scala/function-currying-in-scala 那么你可以将函数包装起来调用一个curried函数(Function.curried),然后简单地在args中填入并调用它然后调用它