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
答案 0 :(得分:7)
类型=> T
表示f
是按名称调用参数。这意味着f
的类型为T
,传递给函数的表达式将在使用时进行评估(而不是在调用函数时。
类型String => T
表示f
是Function[String,T]
,即从String
到T
的函数。
当您使用"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***
因为您现在正在将函数 g
从String
正确传递给某些T
。这里T
是String
,因为函数只是将***
添加到传递的任何内容的末尾并返回修改后的字符串。