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はメソッドのアリティを抽象化しません。言い換えれば、各アリティの定型文を書かずにそれを行う方法はありません。

幸いなことに、MilesSabinは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)そして、ある時点で引数を単純に詰め込んで、それを呼び出します

于 2012-04-17T08:02:33.237 に答える