如何理解scala占位符

时间:2017-02-19 17:28:41

标签: scala

我是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/

由于

2 个答案:

答案 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.getNamequery作为参数调用此函数,返回Boolean使用的if

这给我们留下了(3)中的两个下划线。在Scala中有几种方法可以使用下划线,所有这些方法基本上都是“我不需要这个东西的名字”。这是匿名函数语法的缩写。请记住,filesMatching的第二个参数是一个需要两个String的函数。我们可以将其重写为

def filesRegex(query: String) = filesMatching(query, (a, b) => a.matches(b))

换句话说,第一个_是第一个参数的占位符,第二个_是第二个参数的占位符。