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
  }
}

我玩了上面的代码,结果告诉了我。我有两个问题

1) 为什么呼叫 1 和呼叫 2 都进入选择 1?

2)如何传递参数以便我可以进入选择 2。

谢谢,

choice 1
()
choice 1
Hi
4

1 回答 1

7

类型=> T意味着这f是一个按名称调用的参数。这意味着 thatf是 type T,传递给函数的表达式将在使用时进行计算(而不是在调用函数时。

类型String => T表示 that fis a Function[String,T],即从 aString到 a的函数T

当您使用"Hi", aString作为参数调用时,Scala 发现 有两种选择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传递String给 some TT这里是,因为该String函数只是添加***到它传递的任何内容的末尾并返回修改后的字符串。

于 2012-05-22T06:23:07.943 回答