def func(arg: String => Int): Unit = {
// body of function
}
我的意思是这个片段: String => Int
答案 0 :(得分:9)
简短回答
它是一个接收String并返回Int
的函数答案很长
在Scala中,功能是一等公民。这意味着你可以将它们存储在变量中(或者就像在这种情况下一样)将它们作为参数传递。
这是函数文字的样子
() => Unit
这是一个不接收参数并返回Unit的函数(java相当于void)。
这是一个接收String作为参数并返回Int:
的函数(String) => Int
另外,scala让你删除括号作为一种语法糖的形式,就像在你的例子中一样。前面的arg:
只是参数的名称。
在func
内,您可以调用收到的函数(arg
),如下所示:
val result = arg("Some String") // this returns a Int
答案 1 :(得分:4)
如Advantages of Scala’s Type System中所述,它是功能类型。
文章Scala for Java Refugees Part 6: Getting Over Java在“高阶函数”一节中描述了这种语法。
def itrate(array:Array[String], fun:(String)=>Unit) = {
for (i <- 0 to (array.length - 1)) { // anti-idiom array iteration
fun(array(i))
}
}
val a = Array("Daniel", "Chris", "Joseph", "Renee")
iterate(a, (s:String) => println(s))
请参阅?语法是如此自然,你几乎想念它 从顶部开始,我们查看有趣参数的类型,我们会看到
(type1, …)=>returnType
语法,表示功能类型。
在这种情况下,fun将是一个函数,它接受String类型的单个参数并返回Unit(实际上是void,所以任何东西)。
在函数中有两行,我们看到实际调用函数的语法。 fun被视为范围内可用的方法,调用语法相同 C / C ++黑暗时代的退伍军人会认为这种语法让人联想到当天如何处理函数指针。
不同的是,没有内存泄漏需要担心,并且没有太多星形符号引入的过度冗长。
在你的情况下:def func(arg: String => Int): Unit
,arg
将是一个带字符串并返回Int的函数。
答案 2 :(得分:4)
你也可能看到它(可能是反编译器)写成
def func(arg: Function1[String, Int]): Unit = {
// body of function
}
它们完全相同。