0

考虑以下代码:

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 返回类型,因为我需要将此值用于后期处理。有没有办法做到这一点?

4

3 回答 3

3

Scala 没有抽象方法的数量。或者,换句话说,如果不为每个 arity 编写样板文件,就无法做到这一点。

幸运的是,Miles Sabin 用Shapeless编写了所有样板文件。

于 2012-04-17T14:11:10.843 回答
2

我想你想要这样的东西:

def funcWithArgs(args: String*) = args foreach println
def callAnyFuncWithArgs[A, B]
  (args: A*)(f: (A*) => B) = f(args: _*)

然后调用 funcWithArgs 作为部分应用函数:

callAnyFuncWithArgs("bingo")(funcWithArgs _)
于 2012-04-17T09:51:58.037 回答
1

这可能适用于函数柯里化......看看这里: http: //www.codecommit.com/blog/scala/function-currying-in-scala 然后你可以包装函数来调用柯里化函数( Function.curried) 并在某个时候简单地填充 args 然后调用它

于 2012-04-17T08:02:33.237 回答