scala占位符调用所需的代码说明

时间:2017-05-23 08:35:06

标签: scala

任何人都可以帮助我理解这段代码......

object FileMatcher {
private def filesHere = (new java.io.File("C:/scalaTestcode")).listFiles
private def fileMatching(matcher : String => Boolean) =
{
   for(file <- filesHere; if matcher(file.getName)) yield file
}
def filesEnding(query:String) = 
  fileMatching {_.endsWith(query) }
def filesContaining(query:String) = 
  fileMatching {_.contains(query)}
def fileRegex(query:String)=
  fileMatching {_.matches(query)}
def main(args : Array[String])
{
  (filesEnding(".scala").toArray).foreach(println)
}
}

此代码正常运行并符合预期。但是我试图理解filesEnding方法如何用&#34; _&#34;工作。我的意思是当我从main调用时,我调用Query作为filesEnding方法中的参数,将函数传递给fileMatching,其中包含&#34; _&#34;。那个&#34; _&#34;在fileMatching中填充了一些字符串,但是当我尝试使用任何其他字符串进行fileMatching时,它会给出编译错误,如果&#34; _&#34;在这种情况下意味着任何字符串,它应该适用于任何字符串或由&#34; _&#34;我们告诉scala编译器,这将由其他地方/实现时填充。

任何细节解释将不胜感激.... 非常感谢...

4 个答案:

答案 0 :(得分:1)

df = pd.read_csv('file', dtype={'manual_raw_value':str, 'raw_value':str}) _.endsWith(query)的缩写。

答案 1 :(得分:1)

_可以用作速记,意思是&#34;使用值&#39; m操作&#34;

这可能很有用:What are all the uses of an underscore in Scala?

在你的情况下,它可以被匿名函数x => x.endsWith(query)取代,但由于它不含糊,scala允许你使用那个语法糖

答案 2 :(得分:1)

让我们从fileMatching()开始。

def fileMatching(matcher : String => Boolean) = ...

参数matcher是一个接受String并返回Boolean的函数。

因此,必须准确描述_.endsWith(query)_.contains(query)以及_.matches(query)。所有这些函数都采用String,由下划线表示,并返回Boolean

现在如何使用matcher参数?

... if matcher(file.getName) ...

因此file.getName成为String所代表的_,它被提供给matcher()函数,而Boolean结果将在if中进行测试{1}}条款。

答案 3 :(得分:1)

_是占位符语法的用法。本质上,如果lambda签名中的每个变量仅使用时间,并且每个变量按签名中给出的顺序使用,则可以用_替换每个可变的变量并删除签名,因为它不是不明确的。

由于您使用的代码示例与“Scala编程”一书中使用的代码示例非常相似,因此您可能需要返回“8.5占位符语法”一章,详细说明。