Scala的功能作为参数用法

che*_*hen 2 functional-programming scala

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
  }
}
Run Code Online (Sandbox Code Playgroud)

我玩上面的代码,结果显示我.我有两个问题

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

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

谢谢,

choice 1
()
choice 1
Hi
Run Code Online (Sandbox Code Playgroud)

dhg*_*dhg 7

类型=> T表示f是按名称调用参数.这意味着它f是类型的T,并且传递给函数的表达式将在使用时进行求值(而不是在调用函数时).

类型String => T意味着f是a Function[String,T],即从a String到a 的函数T.

当您使用"Hi"a String作为参数调用时,Scala会发现有两种选择printResult:

1)=> T:在这种情况下,案件T会绑定String,这很好.

2)String => T:这不起作用,因为String它不是任何功能String......它根本不是一个功能.

你如何解决这个问题取决于你想要做什么.如果你只想修复printResult调用方式,那么你打电话给它:

val g: (String => String) = (s: String) => s + "***"
cc.printResult(g)
Run Code Online (Sandbox Code Playgroud)

打印:

choice 2
HI THERE***
Run Code Online (Sandbox Code Playgroud)

因为你现在正在正确传递函数,gString一些T.这T就是String,因为函数只是添加***到它传递的任何内容的末尾并返回修改后的字符串.