我是Scala的新手,我不明白下面这段代码。
对于// 1,什么是=>布尔值? “匹配器”与一个相同 在// 2?
在// 3中,为什么有两个占位符_?
代码:
def filesMatching(query: String, matcher: (String, String) => Boolean //1 ) = {
for (
file <- filesHere; // filesHere is a function that returns an Array of files
if matcher(file.getName, query) //2
) yield file
}
def filesEnding(query: String) =
filesMatching(query, (fileName: String, query: String) => fileName.endsWith(query))
def filesRegex(query: String) =
filesMatching(query, _.matches(_) //3)
代码来自此处:https://mbonaci.github.io/scala/
由于
答案 0 :(得分:0)
这表示一个函数,它接受String类型的2个参数并返回一个布尔值:
(String, String) => Boolean
例如,这里我们使用一个函数调用filesMatching
,该函数检查第一个字符串是否以第二个字符串结尾:
filesMatching(query, (fileName: String, query: String) => fileName.endsWith(query))
然后在matcher
的正文中使用名为filesMatching
的此参数。如您所见,它接收2个字符串并返回一个布尔值:
if matcher(file.getName, query)
最后,_
只是这个函数的简短表示法,每个_
对应一个函数参数。最后一行相当于:
filesMatching(query, (fileName: String, query: String) => fileName.matches(query))
答案 1 :(得分:0)
对于(1),filesMatching
是一个带有两个参数的函数,一个是String
query
,另一个是函数(String, String) => Boolean
,即一个函数一对字符串并返回一个名为matcher
的布尔值。
在(2)中,使用字符串file.getName
和query
作为参数调用此函数,返回Boolean
使用的if
。
这给我们留下了(3)中的两个下划线。在Scala中有几种方法可以使用下划线,所有这些方法基本上都是“我不需要这个东西的名字”。这是匿名函数语法的缩写。请记住,filesMatching
的第二个参数是一个需要两个String
的函数。我们可以将其重写为
def filesRegex(query: String) = filesMatching(query, (a, b) => a.matches(b))
换句话说,第一个_
是第一个参数的占位符,第二个_
是第二个参数的占位符。