Scala的功能作为参数用法

时间:2012-05-22 06:19:10

标签: scala functional-programming

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

1 个答案:

答案 0 :(得分:7)

类型=> T表示f是按名称调用参数。这意味着f的类型为T,传递给函数的表达式将在使用时进行评估(而不是在调用函数时。

类型String => T表示fFunction[String,T],即从StringT的函数。

当您使用"Hi"拨打String作为参数时,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***

因为您现在正在将函数 gString正确传递给某些T。这里TString,因为函数只是将***添加到传递的任何内容的末尾并返回修改后的字符串。