2
class ClosureClass {
  def printResult[T](f: => T) = {
    println("choice 1")
    println(f)
  }

  def printResult[T](f: String => T) = {
    println("choice 2")
    println(f("HI THERE"))
  }
}

object demo {
  def main(args: Array[String]) {
    val cc = new ClosureClass
    cc.printResult()   // call 1
    cc.printResult("Hi")  // call 2
  }
}

上記のコードで遊んでみたところ、結果がわかりました。2つの質問があります

1)コール1とコール2の両方が選択肢1に入るのはなぜですか?

2)選択2に入ることができるように、どのようにパラメーターを渡すことができますか。

ありがとう、

choice 1
()
choice 1
Hi
4

1 に答える 1

7

タイプは、それが名前による呼び出しパラメーターである=> Tことを意味します。fこれfは が typeTであることを意味し、関数に渡された式は (関数が呼び出されたときではなく) 使用されるときに評価されます。

タイプとは、が aであること、つまり a から aへの関数であることString => Tを意味します。fFunction[String,T]StringT

"Hi", aを引数として呼び出すとString、Scala は に 2 つの選択肢があることを認識しますprintResult

1) => T: この場合、Tは にバインドされますがString、これで問題ありません。

2) String => T: これは何の関数でもないため機能しません...まったく関数でStringはありません。String

これを修正する方法は、何をしようとしているのかによって異なります。の呼び出し方法を修正したいだけの場合printResultは、次のように呼び出します。

val g: (String => String) = (s: String) => s + "***"
cc.printResult(g)

これは次を印刷します:

choice 2
HI THERE***

あなたは今、関数,gを fromStringから someに正しく渡しているからTです. 関数は渡されたものの最後に追加し、変更された文字列を返すだけなので、これはTです。String***

于 2012-05-22T06:23:07.943 に答える