为什么这不适用于scala:
val cloz: (Int,String => String) = (num: Int, str: String) => {
str+"-"+num
}
我看到一些闭包只用1个arg定义的例子,如下所示:
val thingy: (Int => Int) = (num: Int) => {
num * 2
}
但绝对无处(包括Scala电子书)我能找到任何解释“val”闭包语法的信息。
谢谢! 杰米
答案 0 :(得分:14)
正确的语法是:
val cloz: (Int, String) => String = (num: Int, str: String) => {
str + "-" + num
}
顺便说一句,在这个简单的例子中,您还可以简化这样的表达式(特别是如果您已经明确指定了函数的类型):
val cloz: (Int, String) => String = (num, str) => str + "-" + num
您还可以使用REPL来探索Scala - 这是一个非常好的工具。您只需启动scala
而无需任何参数即可启动它。这是示例会话:
scala> val cloz = (num: Int, str: String) => str + "-" + num
cloz: (Int, String) => java.lang.String = <function2>
scala> val cloz: (Int, String) => String = (num: Int, str: String) => {
| str + "-" + num
| }
cloz: (Int, String) => String = <function2>
scala> val cloz: (Int, String) => String = (num, str) => str + "-" + num
cloz: (Int, String) => String = <function2>
scala> def printCloz(cloz: (Int, String) => String, num: Int, str: String) = print(cloz(num, str))
printCloz: (cloz: (Int, String) => String, num: Int, str: String)Unit
正如您所看到的,它不仅允许您以交互方式执行代码,还可以在您定义某些内容时打印类型信息。
答案 1 :(得分:0)
根据@Eazy Angel的优秀答案,我为那些和我一样困惑的人提供这个:
val cloz: (Int,String) => String = (num, str) => {
str+"-"+num
}
def f1( clozArg: ((Int,String) => String), intArg: Int, stringArg: String ): String = {
clozArg(intArg,stringArg)
}
println("f1 result="+f1(cloz, 5, "okee"))
但请注意(如果我错了请纠正我)scala类型推断的b / c你不需要明确指定所有这些类型。到目前为止我唯一一次看到你必须做的就是使用递归。
-
的更新:强>
此奇异语法也有效:(参见第3行的返回类型)
val cloz = (num: Int, str: String) => {
str+"-"+num
} : String
def f1( clozArg: ((Int,String) => String), intArg: Int, stringArg: String ): String = {
clozArg(intArg,stringArg)
}
println("f1 result="+f1(cloz, 5, "okee"))