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)
类型=> 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)
因为你现在正在正确传递函数,g从String一些T.这T就是String,因为函数只是添加***到它传递的任何内容的末尾并返回修改后的字符串.