任何人都可以帮助我理解这段代码......
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编译器,这将由其他地方/实现时填充。
任何细节解释将不胜感激.... 非常感谢...
答案 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占位符语法”一章,详细说明。